2つのリストの違いを取得:
私は、オブジェクト型の2つのリストを持っている
List<MyClass> list1;
List<MyClass> list2;
これら2つのリストの間でのデータの差異を抽出するための最良の方法(性能とクリーンなコード)は何ですか?
追加、削除、または変更されたオブジェクト(およびその変更)を取得することを意味しますか?
2つのリストの違いを取得:
私は、オブジェクト型の2つのリストを持っている
List<MyClass> list1;
List<MyClass> list2;
Except
をUnion
と試してください。両方で違いを探すには、両方とも行う必要があります。
var exceptions = list1.Except(list2).Union(list2.Except(list1)).ToList();
OR LINQの代替として、はるかに高速なアプローチがあるかもしれません:HashSet.SymmetricExceptWith():
var exceptions = new HashSet(list1);
exceptions.SymmetricExceptWith(list2);
+1が見つかりました。 –
IEnumerable<string> differenceQuery = list1.Except(list2);
それはあなたにリスト2の項目だけを与えるわけではありません:) – mattytommo
@MitchWheat - 私が答えを投稿した時はどうですか? –
あなたが得るためにFindAll
を使用することができますあなたが望む結果、IEquatable
またはIComparable
が実装されていなくてもr MyClass
。あなたはlist1
に比較することにより、list2
から、あなたの興味のアイテムを取得することができ、同様に
List<MyClass> interetedList = list1.FindAll(delegate(MyClass item1) {
MyClass found = list2.Find(delegate(MyClass item2) {
return item2.propertyA == item1.propertyA ...;
}
return found != null;
});
:ここでは一例です。
この戦略では、「変更された」アイテムも表示される場合があります。リスト1またはリスト2にではなく、両方のいずれかであるアイテムを取得するための
一つの方法は、次のようになります。
var common = list1.Intersect(list2);
var exceptions = list1.Except(common).Concat(list2.Except(common));
がList<T>
public static void GetPropertyChanges<T>(this T oldObj, T newObj)
{
Type type = typeof(T);
foreach (System.Reflection.PropertyInfo pi in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
{
object selfValue = type.GetProperty(pi.Name).GetValue(oldObj, null);
object toValue = type.GetProperty(pi.Name).GetValue(newObj, null);
if (selfValue != null && toValue != null)
{
if (selfValue.ToString() != toValue.ToString())
{
//do your code
}
}
}
}
のhttpため、その周囲のオブジェクトの比較とループのためにこれを試してみてください。 //msdn.microsoft.com/en-us/library/bb460136.aspx、http://msdn.microsoft.com/en-us/library/bb300779.aspx、http://msdn.microsoft.com/en-us/library/ us/library/bb397894.aspx –
「変更されました」と正確にはどういう意味ですか?例えば、list1が「foO」を持ち、list2が「bar」を持っている場合、それは追加と削除か変更ですか? –
予想される入出力を与えてください。あなたは、オブジェクトが出現する順序や、同じリスト内に重複したオブジェクトを持つことができるかどうか、あるいは「変更された」場合でも、2つのオブジェクトが同じオブジェクトを表すかどうかを判断する方法について、 – StriplingWarrior