IEnumerable List Manipulation

时间:2014-04-09 16:53:50

标签: c# linq list ienumerable

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

这是我到目前为止所做的:

List<item> list1 = { item1, item2, item3, item7, item8, item11, item12 }
List<item> list2 = { item4, item5, item6, 
                     item4, item5, item6, 
                     item9, item10, 
                     item9, item10 }

结果集应如下所示:

List<item> listFinal = { item1, item2, item3, 
                         item4, item5, item6, 
                         item4, item5, item6, 
                         item7, item8, 
                         item9, item10, 
                         item9, item10, 
                         item11, item12 }

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

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

3 个答案:

答案 0 :(得分:6)

只需使用Concat然后OrderBy

var resultList = list1.Concat(list2).OrderBy(x => x.Something).ToList();

更新根据您的评论,这是一种您可以使用的扩展方法。由于您没有告诉我们您的课程如何,我只是创建一个类的接口示例

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

接口和类:

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

    public Item(int number)
    {
        SequenceNumber = number;
    }
}

以下是用法(list1list2List<Item>):

var result = list1.ConcatItems(list2);

该方法正是您想要的,但您应该根据您的情况实施该方法,该部分取决于您...

以下是LINQPad的演示:

的List1:

enter image description here

列表2:

enter image description here

输出:

enter image description here

最后一点注意事项:此方法假设您的商品已订购。如果不是,请先对商品进行排序,然后调用方法:

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

答案 1 :(得分:0)

您可以使用列表中的AddRange方法组合同一类型的另一个列表。这不会实现你想做的事吗?

答案 2 :(得分:0)

请试试这个

var list = list1.Concat(list2);