我有两个List
List<List<KeyValuePair<string,string>>> List1;
List<List<KeyValuePair<string,string>>> List2;
我想获得一个List&gt;&gt; List3,这是List1和List2的不同之处。 注意: - 数据是这样的:
清单1 -
[{name, David},{eid,55},{sal,25}],
[{name, Tina},{eid,56},{sal,20}],
[{name, Bony},{eid,57},{sal,26}],
[{name, Mahima},{eid,58},{sal,20}]
清单2 -
[{name, David},{eid,55},{sal,25}],
[{name, Tina},{eid,56},{sal,20}]
如上面的列表中我们可以看到List1中有两个元素在List2中不可用,我想获取这些元素的列表。
预期产量: List3 -
[{name, Bony},{eid,57},{sal,26}],
[{name, Mahima},{eid,58},{sal,20}]
答案 0 :(得分:2)
您可以使用此方法:
List<List<KeyValuePair<string, string>>> List3 = List1
.Where(l => !l.All(kv => List2.Any(l2 => l2.Contains(kv))))
.ToList();
您可以在此处使用Contains
,因为KeyValuePair<TKey, TValue>
是值类型。如果是课程,则必须使用Any
并将每个键和值相互比较(或覆盖Equals
+ GetHashCode
)。
答案 1 :(得分:1)
public class Comparer : IEqualityComparer<List<KeyValuePair<string, string>>>
{
public static readonly Comparer Default = new Comparer();
private Comparer() { }
private static string KvpToString(KeyValuePair<string,string> kvp)
{
return (string.IsNullOrEmpty(kvp.Key) ? string.Empty : kvp.Key) + (string.IsNullOrEmpty(kvp.Value) ? string.Empty : kvp.Value);
}
public bool Equals(List<KeyValuePair<string, string>> x, List<KeyValuePair<string, string>> y)
{
var xx = x.Select(KvpToString).Aggregate((c, n) => c + n);
var yy = y.Select(KvpToString).Aggregate((c, n) => c + n);
return string.Compare(xx, yy) == 0;
}
public int GetHashCode(List<KeyValuePair<string, string>> obj)
{
return 0;
}
}
所以最后,它的所有需求是:
var list3 = list1.Except(list2, Comparer.Default);
编辑:抱歉,我复制了以前版本的Comparer,它缺少私有构造函数和Comparer.Default字段。现在修好了......