比较两个keyvaluepair列表

时间:2015-12-01 10:45:41

标签: c#

我有两个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}] 

2 个答案:

答案 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字段。现在修好了......