[英]How do I sort a List<Type> by List<int>?
在我的c#MVC项目中,我有一个项目列表,我想按照另一个列表的顺序排序
var FruitTypes = new List<Fruit> {
new Fruit { Id = 1, Name = "Banana"},
new Fruit { Id = 2, Name = "Apple" },
new Fruit { Id = 3, Name = "Orange" },
new Fruit { Id = 4, Name = "Plum"},
new Fruit { Id = 5, Name = "Pear" },
};
SortValues = new List<int> {5,4,3,1,2};
目前我的列表显示为水果类型的默认值。
如何通过SortValues对Fruit列表进行排序?
目前还不清楚您是按SortValues
的索引进行排序,还是SortValues
是否包含应该连接的相应Id
值。
在第一种情况下:
首先,您必须将两个列表压缩在一起,然后您可以对Zip生成的复合类型进行排序,然后选择退出的FruitType。
IEnumerable<FruitType> sortedFruitTypes = FruitTypes
.Zip(SortValues, (ft, idx) => new {ft, idx})
.OrderBy(x => x.idx)
.Select(x => x.ft);
但是,这只是按SortValues
指示的顺序对第一个列表进行排序, 而不是加入ID。
在第二种情况下,简单的连接就足够了:
IEnumerable<FruitType> sortedFruitTypes = SortValues
.Join(FruitTypes, sv => sv, ft => ft.Id, (_, ft) => ft);
这是有效的,因为Enumerable.Join
维护了连接的“左”手侧的顺序。
虽然几乎可以肯定有更多的LINQ-y方式,但如果你倾向于冗长,你可以用迭代器函数来实现这一点。 例如:
public IEnumerable<Fruit> SortFruits(IEnumerable<Fruit> unordered, IEnumerable<int> sortValues)
{
foreach (var value in sortValues)
yield return unordered.Single(f => f.Id == value);
}
我喜欢它关于它正在做什么的明确。 当每个列表中的项目数不同时,您可以考虑抛出异常,或者如果没有排序值,您可能只是不返回项目。 你必须决定两个集合中“缺失”值的行为应该是什么。 我认为必须处理这些场景是一个很好的理由将它全部放在一个方法中,而不是更长的LINQ查询。
时间复杂度:Linq的O(n)+ TM。
使用Linq FirstOrDefault按排序值获取元素。
List<int> SortValues = new List<int> { 5, 4, 3, 1, 2 }; List<Fruit> result = new List<Fruit>(); foreach (var element in SortValues) { Fruit f = FruitTypes.FirstOrDefault(fruitElement => fruitElement.Id == element); result.Add(f); }
实施: DotNetFiddler
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.