【问题标题】:Linq: Ignore non joinable items from two lists without throwing error?Linq:忽略两个列表中的不可连接项而不抛出错误?
【发布时间】:2011-05-06 22:34:24
【问题描述】:

在下面的代码中,两个列表在索引上连接。但是任何一个列表都可能比另一个列表有更多的项目,我只想加入包含最少项目的列表,并将其余的从另一个列表中剔除。因此,如果列表 1 有 5 个项目,而列表 2 有 7 个项目,我想将两者都加入到项目 5,并忽略列表 2 的剩余项目。 (反之亦然)

var joinLbxs = lbxShtCols.Items
    .Cast<ListItem>()
    .Select((xlFldList, index) => new
    {
        xlFldList,
        tblFldList = lbxSqlTablesCols.Items[index]
    });

【问题讨论】:

  • 所以你想把它们压缩在一起吗?您使用的是 .NET 4.0。它有一个Zip 扩展方法。

标签: linq list join


【解决方案1】:

Zip 自己实现也不算太复杂。

public static IEnumerable<TResult> Zip<TSource, TOther, TResult>(
    this IEnumerable<TSource> source,
    IEnumerable<TOther> other,
    Func<TSource, TOther, TResult> resultSelector)
{
    using (var e1 = source.GetEnumerator())
    {
        using (var e2 = other.GetEnumerator())
        {
            while (e1.MoveNext() && e2.MoveNext())
            {
                yield return resultSelector(e1.Current, e2.Current);
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    正如@Steven 在评论中建议的那样,如果您使用的是 .Net 4.0,请使用 Zip() method。如果不这样做,您可以使用 MoreLinq 来提供相同的功能。

    或者你可以自己做(假设两个列表都是IList&lt;T&gt; 并且有快速索引器):

    from i in Enumerable.Range(0, new[] { list1.Count, list2.Count }.Min())
    select new
    {
        item1 = list1[i],
        item2 = list2[i]
    }
    

    【讨论】:

    • 这样,谢谢!!我使用 new List 而不是 new[].
    【解决方案3】:

    尝试将 2 个列表相交;那会给你常见的物品。 Take() 您想要的 2 个列表中最小的数字。目前尚不清楚您是否知道哪个列表最小(按照惯例),因此请事先确定。如果您在Take() 之前需要,可以选择对列表进行排序。

    int numToTake = (lbxShtCols.Count >= lbxSqlTablesCols.Count)
                    ?lbxShtCols.Count
                    :lbxSqlTablesCols.Count;
    
    var commons = lbxShtCols.Intersect(lbxSqlTablesCols)
                            .Take(numToTake);
    

    【讨论】:

    • 从示例代码看来,他不想要交集,而是要压缩。
    • 随机投票者:为什么 -1 没有你的解释? OP 将这个问题留给了解决方案。问题的核心是找到两个集合之间的相似之处。这个答案怎么不能解决这个问题?
    • 是的,我不想相交。
    • 如果较小的列表始终是较大列表的子集,这将是一个正确的答案,+1,但这样也将是不必要的
    • 反对者是我,我认为问题中的代码很清楚它在做什么,而您的代码做了完全不同的事情。
    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2018-02-28
    • 2016-03-21
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多