我需要通过仅保留不同的元素并将一个数组的元素与另一个数组的元素相交来交叉 2 个数组 ( List<T>
),如下所示:
A1 B1 C1 D1
W2 X2 Y2 Z2
=> A1 W2 B1 X2 C1 Y2 D1 Z2
A1 B1 A1 D1
W2 X2 Y2 Z2
=> A1 W2 B1 X2 Y2 D1 Z2 // repeating A1
A1 B1 A1 D1
Z2 X2 Y2 Z2
=> A1 Z2 B1 X2 Y2 D1 // repeating A1, Z2
A1 B1 C1 D1 E1
Z2 X2 Y2
=> A1 Z2 B1 X2 C1 Y2 D1 E1
执行此操作的最佳 LINQ 查询是什么?
最佳答案
(请注意,List<T>
不是数组,。)
好吧,我认为如果您使用的是 .NET 4,并且假设数组长度相同,这将满足您的需求:
var query = first.Zip(second, (x, y) => new[] { x, y })
.SelectMany(pair => pair)
.Distinct();
编辑:正如评论中所指出的,Distinct
的顺序不保证。然而,我希望它在实践中实际上保持不变......考虑到我建议的其他变化只会以积极(和微小的)方式影响可观察到的结果,我无法想象这是将要改变。
lasseespeholt 的解决方案处理交错部分。如果你想要绝对保证的顺序,你总是可以自己实现 Disrinct,就像我在 Edulinq 中所做的那样:
public static IEnumerable<TSource> OrderPreservingDistinct<TSource>(
this IEnumerable<TSource> source)
{
return source.OrderPreservingDistinct(EqualityComparer<TSource>.Default);
}
public static IEnumerable<TSource> OrderPreservingDistinct<TSource>(
this IEnumerable<TSource> source,
IEqualityComparer<TSource> comparer)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return OrderPreservingDistinct(source, comparer ??
EqualityComparer<TSource>.Default);
}
private static IEnumerable<TSource> OrderPreservingDistinct<TSource>(
IEnumerable<TSource> source,
IEqualityComparer<TSource> comparer)
{
HashSet<TSource> seenElements = new HashSet<TSource>(comparer);
foreach (TSource item in source)
{
if (seenElements.Add(item))
{
yield return item;
}
}
}
然后:
var result = firstList.Interleave(secondList).OrderPreservingDistinct();
关于.net - 使用 LINQ 混合 2 个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5977295/