如果我有一个包含2个或更多列表的字典,如何在这些列表之间快速查找共享项目并将这些共享项目添加到字典外部的列表中?
例如:
list1的:
列表2:
项目list3:
extList:
然后从字典内的列表中删除此共享项。
我已添加list3
以显示可能会忽略多余的项目,并且我已指定了2个或更多列表。
答案 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() };
如果您不在乎每个单词出现的次数,则可以删除最后一行。请注意,这不会告诉您该单词在哪个列表中。