.NET 6.0 C#上で、データクラスのList内に重複している値があるか、Linqを使ってチェックするサンプルを作成しました。
ソースコードはGitHubで公開しています。
重複チェックするデータクラスの構造はこちら。
1 2 3 4 5 6 7 8 |
public class DataClass { public int Id { get; set; } public string? Code { get; set; } public string? Value { get; set; } } |
テストデータ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
[TestClass()] public class DataClassListHelperTests { private List<DataClass> DataClassList1; private List<DataClass> DataClassList2; private List<DataClass> DataClassList3; private List<DataClass> DataClassList4; public DataClassListHelperTests() { DataClassList1 = new List<DataClass> { new DataClass() { Id = 1, Code = "001", Value = "テスト1" }, new DataClass() { Id = 2, Code = "002", Value = "テスト2" }, new DataClass() { Id = 3, Code = "003", Value = "テスト3" } }; DataClassList2 = new List<DataClass> { new DataClass() { Id = 1, Code = "001", Value = "テスト1" }, new DataClass() { Id = 2, Code = "002", Value = "テスト1" }, new DataClass() { Id = 3, Code = "003", Value = "テスト1" } }; DataClassList3 = new List<DataClass> { new DataClass() { Id = 1, Code = "001", Value = "テスト1" }, new DataClass() { Id = 2, Code = "002", Value = "テスト2" }, new DataClass() { Id = 1, Code = "003", Value = "テスト3" } }; DataClassList4 = new List<DataClass> { new DataClass() { Id = 1, Code = "001", Value = "テスト1" }, new DataClass() { Id = 2, Code = "002", Value = "テスト2" }, new DataClass() { Id = 3, Code = "001", Value = "テスト3" } }; } |
データクラス内のIdが重複しているかチェックするメソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/// <summary> /// データクラスのListに重複しているIdがあるかチェックする。 /// </summary> /// <returns> /// true;重複無し /// false;重複有り /// </returns> public static bool IsDuplicateId_Ptn1(List<DataClass> dataList) { if (dataList.Where(x1 => x1.Id != 0) .Select(x2 => x2.Id) .GroupBy(x3 => x3) .Any(x4 => x4.Count() > 1)) return false; //重複有り return true; //重複無し } |
実行例
1 2 3 4 5 6 7 8 9 10 |
[TestMethod()] public void IsDuplicateId_Ptn1Test() { Assert.IsTrue(DataClassListHelper.IsDuplicateId_Ptn1(DataClassList1)); Assert.IsTrue(DataClassListHelper.IsDuplicateId_Ptn1(DataClassList2)); Assert.IsFalse(DataClassListHelper.IsDuplicateId_Ptn1(DataClassList3)); Assert.IsTrue(DataClassListHelper.IsDuplicateId_Ptn1(DataClassList4)); } |
データクラス内のIdが重複しているかチェックし、重複しているデータを返すメソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/// <summary> /// データクラスのListに重複しているIdがあるかチェックする /// </summary> /// <returns> /// Item1 /// true;重複無し /// false;重複有り /// Item2 /// 重複しているデータのList /// </returns> public static (bool, List<DataClass>?) IsDuplicateId_Ptn2(List<DataClass> dataList) { var duplicateListId = dataList.Where(x1 => x1.Id != 0) .Select(x2 => x2.Id) .GroupBy(x3 => x3) .Where(x4 => x4.Count() > 1) .Select(x5 => x5.Key).ToList(); if (duplicateListId.Count() > 0) return (false, dataList.Where(x6 => duplicateListId.Select(Id => Id).Contains(x6.Id)).ToList()); //重複有り return (true, null) ; //重複無し } |
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[TestMethod()] public void IsDuplicateId_Ptn2Test() { var result1 = DataClassListHelper.IsDuplicateId_Ptn2(DataClassList1); Assert.IsTrue(result1.Item1); Assert.IsTrue(result1.Item2?.Count() == null); var result2 = DataClassListHelper.IsDuplicateId_Ptn2(DataClassList2); Assert.IsTrue(result2.Item1); Assert.IsTrue(result2.Item2?.Count() == null); var result3 = DataClassListHelper.IsDuplicateId_Ptn2(DataClassList3); Assert.IsFalse(result3.Item1); Assert.IsTrue(result3.Item2?.Count() > 0); var result4 = DataClassListHelper.IsDuplicateId_Ptn2(DataClassList4); Assert.IsTrue(result4.Item1); Assert.IsTrue(result4.Item2?.Count() == null); } |
データクラス内のCodeが重複しているかチェックするメソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/// <summary> /// データクラスのListに重複しているCodeがあるかチェックする。 /// </summary> /// <returns> /// true;重複無し /// false;重複有り /// </returns> public static bool IsDuplicateCode_Ptn1(List<DataClass> dataList) { if (dataList.Where(x1 => !string.IsNullOrEmpty(x1.Code)) .Select(x2 => x2.Code) .GroupBy(x3 => x3) .Any(x4 => x4.Count() > 1)) return false; //重複有り return true; //重複無し } |
実行例
1 2 3 4 5 6 7 8 9 10 |
[TestMethod()] public void IsDuplicateCode_Ptn1Test() { Assert.IsTrue(DataClassListHelper.IsDuplicateCode_Ptn1(DataClassList1)); Assert.IsTrue(DataClassListHelper.IsDuplicateCode_Ptn1(DataClassList2)); Assert.IsTrue(DataClassListHelper.IsDuplicateCode_Ptn1(DataClassList3)); Assert.IsFalse(DataClassListHelper.IsDuplicateCode_Ptn1(DataClassList4)); } |
データクラス内のCodeが重複しているかチェックし、重複しているデータを返すメソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/// <summary> /// データクラスのListに重複しているCodeがあるかチェックする。 /// </summary> /// <returns> /// Item1 /// true;重複無し /// false;重複有り /// Item2 /// 重複しているデータのList /// </returns> public static (bool, List<DataClass>?) IsDuplicateCode_Ptn2(List<DataClass> dataList) { var duplicateListCode = dataList.Where(x1 => !string.IsNullOrEmpty(x1.Code)) .Select(x2 => x2.Code) .GroupBy(x3 => x3) .Where(x4 => x4.Count() > 1) .Select(x5 => x5.Key).ToList(); if (duplicateListCode.Count() > 0) return (false, dataList.Where(x6 => duplicateListCode.Select(Code => Code).Contains(x6.Code)).ToList()); //重複有り return (true, null); //重複無し } |
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[TestMethod()] public void IsDuplicateCode_Ptn2Test() { var result1 = DataClassListHelper.IsDuplicateCode_Ptn2(DataClassList1); Assert.IsTrue(result1.Item1); Assert.IsTrue(result1.Item2?.Count() == null); var result2 = DataClassListHelper.IsDuplicateCode_Ptn2(DataClassList2); Assert.IsTrue(result2.Item1); Assert.IsTrue(result2.Item2?.Count() == null); var result3 = DataClassListHelper.IsDuplicateCode_Ptn2(DataClassList3); Assert.IsTrue(result3.Item1); Assert.IsTrue(result3.Item2?.Count() == null); var result4 = DataClassListHelper.IsDuplicateCode_Ptn2(DataClassList4); Assert.IsFalse(result4.Item1); Assert.IsTrue(result4.Item2?.Count() > 0); } |
MSTestの結果。
ソースコード構成
今回使った Visual Studio プロジェクト テンプレートは、クラスライブラリ + .NET 6.0 アプリです。
コメント