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语句来连接列表?
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)
下面是使用(list1和list2是List<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)