我正在使用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语句来连接列表?
答案 0 :(得分:6)
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;
}
}
以下是用法(list1
和list2
为List<Item>
):
var result = list1.ConcatItems(list2);
该方法正是您想要的,但您应该根据您的情况实施该方法,该部分取决于您...
以下是LINQPad
的演示:
的List1:
列表2:
输出:
最后一点注意事项:此方法假设您的商品已订购。如果不是,请先对商品进行排序,然后调用方法:
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);