在列表集合中查找重复项

时间:2011-06-27 04:54:30

标签: c# .net linq list dictionary

如果我有一个包含2个或更多列表的字典,如何在这些列表之间快速查找共享项目并将这些共享项目添加到字典外部的列表中?

例如:

list1的:

  • 主机;英语
  • lir;利比里亚英语

列表2:

  • 主机;英语
  • BAV; Vengo

项目list3:

  • LAT;拉丁

extList:

  • 主机;英语

然后从字典内的列表中删除此共享项。 我已添加list3以显示可能会忽略多余的项目,并且我已指定了2个或更多列表。

3 个答案:

答案 0 :(得分:7)

据我所知,您有两个列表,需要找到这些列表之间的交集,并将此交集添加到第三个列表中:

var list1 = new[] { "eng;English", "lir;Liberian", "English" };
var list2 = new[] { "eng;English", "bav;Vengo", "English" };

extList.AddRange(list1.Intersect(list2));

答案 1 :(得分:1)

这是一个函数,它将获取字典,删除字典中多个列表中的任何字符串,并返回它删除的字符串列表:

static List<string> FindAndRemoveDuplicates(Dictionary<string, List<string>> data)
{
    // find duplicates
    var dupes = new HashSet<string>(
                    from list1 in data.Values
                    from list2 in data.Values
                    where list1 != list2
                    from item in list1.Intersect(list2)
                    select item);
    // remove dupes from lists in the dictionary
    foreach (var list in data.Values)
        list.RemoveAll(str => dupes.Contains(str));
    // return a list of the duplicates
    return dupes.ToList();
}

答案 2 :(得分:0)

假设我们有一个列表列表(或一个字典,它会添加一个Key):

List<List<string>> lists = new List<List<string>>()
{
    new List<string> {"Hello", "World", "7"},
    new List<string> {"Hello", "7", "Person"},
    new List<string> {"7", "7", "Hello"}
};

您可以找到所有列表中的项目:

List<string> extList = lists.Cast<IEnumerable<string>>()
                            .Aggregate((a, b) => a.Intersect(b)).ToList();

如果您想获得几个列表中常用的字符串,可以使用:

var counts = from str in lists.SelectMany(list => list)
             group str by str into g
             where g.Count() > 1
             select new { Value = g.Key, Count = g.Count() };

如果您不在乎每个单词出现的次数,则可以删除最后一行。请注意,这不会告诉您该单词在哪个列表中。

相关问题