有两个相同对象类型的列表。我想使用交错模式加入他们,其中i第一个列表的项目由j第二个列表中的项目。
在本质上:
第一份清单
{a、b、c、d、e、f、g、h}
第二个清单
{0,1,2,3,4}
其中第一个列表的分组计数为 3,第二个列表的分组计数为 2。
导致
{a、b、c、0、1、e、f、g、2、3、h、4}
Linq 可以做到这一点吗?
LINQ 本身没有任何东西可以做到这一点 - 这似乎是一个非常专业的要求 - 但它相当容易实现:
public static IEnumerable<T> InterleaveWith<T>
(this IEnumerable<T> first, IEnumerable<T> second,
int firstGrouping, int secondGrouping)
{
using (IEnumerator<T> firstIterator = first.GetEnumerator())
using (IEnumerator<T> secondIterator = second.GetEnumerator())
{
bool exhaustedFirst = false;
// Keep going while we've got elements in the first sequence.
while (!exhaustedFirst)
{
for (int i = 0; i < firstGrouping; i++)
{
if (!firstIterator.MoveNext())
{
exhaustedFirst = true;
break;
}
yield return firstIterator.Current;
}
// This may not yield any results - the first sequence
// could go on for much longer than the second. It does no
// harm though; we can keep calling MoveNext() as often
// as we want.
for (int i = 0; i < secondGrouping; i++)
{
// This is a bit ugly, but it works...
if (!secondIterator.MoveNext())
{
break;
}
yield return secondIterator.Current;
}
}
// We may have elements in the second sequence left over.
// Yield them all now.
while (secondIterator.MoveNext())
{
yield return secondIterator.Current;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)