C#にてFormアプリを開発中です。
List<T>について二つのリストの要素が等しいかを判定する方法は無いでしょうか。
SequenceEqualだと参照比較になってしまい、実データの比較ができません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/07/12 11:21
退会済みユーザー
2018/07/13 00:04
回答2件
0
こっちのオーバーロードを使ってIEqualityComparerを渡せばよいかと。
投稿2018/07/12 11:26
総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/12 11:30
2018/07/12 12:08
退会済みユーザー
2018/07/13 00:09
2018/07/13 14:13
0
ベストアンサー
コメントにあった汎用クラスの使用方法の簡単な例です。
C#
1 static void Main(string[] args) 2 { 3 4 5 List<testclass> List1 = new List<testclass>(); 6 List<testclass> List2 = new List<testclass>(); 7 8 testclass t; 9 10 t = new testclass(1,"ABC","123"); 11 List1.Add(t); 12 13 t = new testclass(2, "DEF","123"); 14 List1.Add(t); 15 16 t = new testclass(1, "ABC","456"); 17 List2.Add(t); 18 19 t = new testclass(2, "DEF","456"); 20 List2.Add(t); 21 22 GenericEqualityComparer<testclass> EqComp=new GenericEqualityComparer<testclass>(ValueEquals); 23 24 Console.WriteLine(string.Format("SequenceEqual = {0}", List1.SequenceEqual(List2))); 25 Console.WriteLine(string.Format("SequenceEqual(IEqualityComparer) = {0}", List1.SequenceEqual(List2,EqComp))); 26 27 Console.ReadKey(); 28 } 29 30 31 public static bool ValueEquals(testclass x, testclass y) 32 { 33 if ((x.Value_A == y.Value_A) && (x.Value_B == y.Value_B)) 34 { 35 return true; 36 } 37 else 38 { 39 return false; 40 } 41 } 42 } 43 44 45 public class testclass 46 { 47 48 public int Value_A; 49 public string Value_B; 50 public string Value_C; 51 52 public testclass(int valueA,string valueB,string valueC) 53 { 54 Value_A = valueA; 55 Value_B = valueB; 56 Value_C = valueC; 57 } 58 59 } 60 61 public class GenericEqualityComparer<T> : IEqualityComparer<T> 62 { 63 private Func<T, T, bool> _predicate; 64 private Func<T, int> _gethash; 65 66 public GenericEqualityComparer(Func<T, T, bool> predicate) 67 : this(predicate, obj => obj.GetHashCode()) 68 { 69 } 70 public GenericEqualityComparer(Func<T, T, bool> predicate, Func<T, int> gethash) 71 { 72 _predicate = predicate; 73 _gethash = gethash; 74 } 75 76 public bool Equals(T x, T y) 77 { 78 return _predicate(x, y); 79 } 80 public int GetHashCode(T obj) 81 { 82 return _gethash(obj); 83 } 84 } 85
比較部分を外だしして、指定できるような形になっています。
例ではHashCodeの比較部分は実装していませんが、そちらの関数も指定できるようになっています。
投稿2018/07/13 00:44
総合スコア10222
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/13 01:15
2018/07/13 01:54
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。