使用Linq和C#,是否可以加入两个列表,但每个项目都有交错?

时间:2009-11-18 19:21:28

标签: c# .net linq

有两个相同对象类型的列表。我想使用交错模式加入它们,其中第一个列表的 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可以实现吗?

1 个答案:

答案 0 :(得分:10)

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;
        }
    }
}