IEnumerable List Manipulation

Eri*_*son 0 c# linq ienumerable list

我正在使用LINQ生成两个单独的项目列表.但是,我需要以特定方式合并这两个列表.我已经按照特定的属性(序列号)进行排序,并做了一些其他的魔术来确保一切都在它应该的位置,但结果集是在逃避我.

这是我到目前为止:

List<item> list1 = { item1, item2, item3, item7, item8, item11, item12 }
List<item> list2 = { item4, item5, item6, 
                     item4, item5, item6, 
                     item9, item10, 
                     item9, item10 }
Run Code Online (Sandbox Code Playgroud)

结果集应如下所示:

List<item> listFinal = { item1, item2, item3, 
                         item4, item5, item6, 
                         item4, item5, item6, 
                         item7, item8, 
                         item9, item10, 
                         item9, item10, 
                         item11, item12 }
Run Code Online (Sandbox Code Playgroud)

基本上,我需要最终列表按顺序包含重复的项目,而不管有多少重复项目.可能有一个,很多或没有.

有两种方法可以使用LINQ轻松实现此目的吗?或者我是否必须使用if语句来连接列表?

Sel*_*enç 6

只需使用ConcatOrderBy

var resultList = list1.Concat(list2).OrderBy(x => x.Something).ToList();
Run Code Online (Sandbox Code Playgroud)

更新:根据你的评论,这里有一个你可以使用的扩展方法.由于你没有告诉我们你的类是什么样的,我只是创建一个类接口,例如.

public static IEnumerable<T> ConcatItems<T>(this IList<T> source, IList<T> dest)
        where T: ISequence
{
     int index = 0;

     foreach (var x in source)
     {
         if (x.SequenceNumber < dest[index].SequenceNumber)
         {
             dest.Insert(index, x);
             continue;
         }
         while(x.SequenceNumber > dest[index].SequenceNumber) index++;

         if (index != dest.Count - 1 && x.SequenceNumber == dest[index].SequenceNumber)
         {
             while (index != dest.Count -1 && 
                 Math.Abs(dest[index].SequenceNumber - dest[index + 1].SequenceNumber) == 1) index++;

              if (index != dest.Count - 1) dest.Insert(index, x);
              else dest.Add(x);
              continue;
         }
         dest.Insert(index, x);
     }

     return dest;
} 
Run Code Online (Sandbox Code Playgroud)

接口和类:

public interface ISequence
{
    int SequenceNumber { get; set; }
}
class Item : ISequence
{
    public int SequenceNumber { get; set; }

    public Item(int number)
    {
        SequenceNumber = number;
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是使用(list1list2List<Item>):

var result = list1.ConcatItems(list2);
Run Code Online (Sandbox Code Playgroud)

该方法正是你想要的,但你应该根据你的情况实现它,那部分取决于你...

这是一个演示LINQPad:

列表1:

在此输入图像描述

列表2:

在此输入图像描述

输出:

在此输入图像描述

最后一点:此方法假定您的商品已订购.如果不是,请先对商品进行排序,然后调用方法:

Comparison<Item> comp = (x, y) => x.SequenceNumber.CompareTo(y.SequenceNumber);
list1.Sort(comp);
list2.Sort(comp);
var result = list1.ConcatItems(list2);
Run Code Online (Sandbox Code Playgroud)