在下面的代码中,这两个列表在索引上连接。但是任何一个列表都可能比另一个列表有更多的项目,我只想加入项目最少的列表,并将其余项目从另一个列表中扔掉。因此,如果列表 1 有 5 个项目,列表 2 有 7 个项目,我想将两者连接到项目 5,并忽略列表 2 的其余项目。(反之亦然)
var joinLbxs = lbxShtCols.Items
.Cast<ListItem>()
.Select((xlFldList, index) => new
{
xlFldList,
tblFldList = lbxSqlTablesCols.Items[index]
});
实现并不太复杂。
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);