Linq:忽略两个列表中的不可联接项,而不会引发错误



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

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

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

或者你可以自己做(假设两个列表都是IList<T>的,并且有快速索引器):

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

尝试将 2 个列表相交;这将为您提供常见项目。 Take()所需的 2 个列表中最小的一个。目前尚不清楚您是否知道哪个列表最小(按照惯例),因此请事先决定。如果需要,可以选择在Take()之前对列表进行排序。

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

相关内容

  • 没有找到相关文章

最新更新