How to perform merge sort using LINQ?

前端 未结 3 783
半阙折子戏
半阙折子戏 2020-12-03 16:04

Assume that you have two IEnumerbale objects. How we can merge them (in some condition e.g merge in merge sort ...) and create a unique IEnumerable

3条回答
  •  北荒
    北荒 (楼主)
    2020-12-03 16:50

    There is no Merge method in System.Linq.Enumerable. If you want one, you have to write it (with a for loop and a yield statement).

    As with many "just by linq" questions - you should assume that every linq method is backed by some plain old .NET code that you could have written yourself.


    Here's an untested freehand non-generic implementation

    public static IEnumerable Merge
    (
    this IEnumerable source1,
    IEnumerable source2
    )
    {
      using(Enumerator e1 = source1.GetEnumerator())
      {
        bool more1 = e1.MoveNext();
        using(Enumerator e2 = source2.GetEnumerator()
        {
          bool more2 = e2.MoveNext();
    
          while (more1 && more2)
          {
            int v1 = e1.Current;
            int v2 = e2.Current;
            if (v1 < v2)
            {
              yield return v1;
              more1 = e1.MoveNext();
            }
            else
            {
              yield return v2;
              more2 = e2.MoveNext();
            }
    
          }
          while (more1 && ! more2)
          {
            yield return e1.Current;
            more1 = e1.MoveNext();
          }
          while (more2 && ! more1)
          {
            yield return e2.Current;
            more2 = e2.MoveNext();
          }
        }
      }
    }
    

提交回复
热议问题