.net - 使用 LINQ 混合 2 个数组

标签 .net linq

我需要通过仅保留不同的元素并将一个数组的元素与另一个数组的元素相交来交叉 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/

相关文章:

.net - T4 文件中缺少命名空间/程序集错误

c# - 如何将键和值写入文本文件并读回?

c# - WF4 的 WorkflowServiceHost 的替代方案?

c# - 由于返回到输出参数 (OracleParameter),第二次插入失败

c# - 用于选择字段的 Linq 表达式

c# - 使用哪一个; Datatable.Select() 还是 LINQ?

c# - 将匿名类型的对象作为参数传递给方法

c# - 请批评我提出的体系结构 : windows service for parsing incoming emails to asp. 网络数据库

c# - 如果始终在本地评估 Skip 和 Take,我如何在 EF Core 中运行分页查询?

c# - 使用 Exact Word 的 LINQ 过滤列表