我搜索过,但我发现只有与两个列表相关的答案。但是当它们超过两个时呢?
List 1 = 1,2,3,4,5
List 2 = 6,7,8,9,1
List 3 = 3,6,9,2,0,1
List 4 = 1,2,9,0,5
List 5 = 1,7,8,6,5,4
List 6 = 1
List 7 =
如何获得常用物品?你可以看到其中一个是空的,所以常见的是空的,但我需要跳过空列表。
答案 0 :(得分:5)
您可以链接Intersect
:
List<int> List1 = new List<int> {1, 2, 3, 4, 5};
List<int> List2 = new List<int> { 6, 7, 8, 9, 1 };
List<int> List3 = new List<int> { 3, 6, 9, 2, 0, 1 };
List<int> List4 = new List<int> { 1, 2, 9, 0, 5 };
List<int> List5 = new List<int> { 1, 7, 8, 6, 5, 4 };
List<int> List6 = new List<int> { 1 };
List<int> common = List1
.Intersect(List2)
.Intersect(List3)
.Intersect(List4)
.Intersect(List5)
.Intersect(List6)
.ToList();
答案 1 :(得分:2)
var data = new [] {
new List<int> {1, 2, 3, 4, 5},
new List<int> {6, 7, 8, 9, 1},
new List<int> {3, 6, 9, 2, 0, 1},
new List<int> {1, 2, 9, 0, 5},
new List<int> {1, 7, 8, 6, 5, 4},
new List<int> {1},
new List<int> {},
null
};
IEnumerable<int> temp = null;
foreach (var arr in data)
if (arr != null && arr.Count != 0)
temp = temp == null ? arr : arr.Intersect(temp);
答案 2 :(得分:2)
var data = new List<List<int>> {
new List<int> {1, 2, 3, 4, 5},
new List<int> {6, 7, 2, 8, 9, 1},
new List<int> {3, 6, 9, 2, 0, 1},
new List<int> {1, 2, 9, 0, 5},
new List<int> {1, 7, 8, 6, 2, 5, 4},
new List<int> {1, 7, 2}
};
List<int> res = data
.Aggregate<IEnumerable<int>>((a, b) => a.Intersect(b))
.ToList();
明确给出了Aggregate的类型,否则两个列表的聚合也必须是List。它可以很容易地适应并行运行:
List<int> res = data
.AsParallel<IEnumerable<int>>()
.Aggregate((a, b) => a.Intersect(b))
.ToList();
修改强>
除了......它并不是并行运行的。问题是IEnumerable上的操作是延迟的,所以即使它们在并行上下文中逻辑合并,实际的合并也发生在ToList()
,这是单线程的。对于并行执行,最好保留IEnumerable并返回列表:
List<int> res = data
.AsParallel()
.Aggregate((a, b) => a.Intersect(b).ToList());
答案 3 :(得分:2)
一种方法是使用HashSet
。您可以将第一个集合的项目放在哈希中,然后在第一个集合之后迭代每个集合,并创建一个新哈希,您可以将当前集合中的项目添加到哈希中。最后,您将该公共哈希集分配给整个哈希集,如果它是空的则中断。最后,您只需返回整个哈希集。
public IEnumerable<T> CommonItems<T>(IEnumerable<IEnumerable<T>> collections)
{
if(collections == null)
throw new ArgumentNullException(nameof(collections));
using(var enumerator = collections.GetEnumerator())
{
if(!enumerator.MoveNext())
return Enumerable<T>.Empty();
var overall = new HashSet<T>(enumerator.Current);
while(enumerator.MoveNext())
{
var common = new HashSet<T>();
foreach(var item in enumerator.Current)
{
if(hash.Contains(item))
common.Add(item);
}
overall = common;
if(overall.Count == 0)
break;
}
return overall;
}
}