我正在尝试根据字符串数组对自定义列表进行排序,但我失败了,例如它根本没有对列表进行排序,
Public class CrateOrder
{
public int Id { get; set; }
public string Name { get; set; }
public Stream OrderStream { get; set; }
}
string[] selectedFruits = {"Apple", "Mango"}; // in real get from web services
var selectedFruitsList = selectedFruits.ToList();
List<CrateOrder> cFruit = GetCrateOrderFromWebServices();
var sorted = cFruit.OrderBy(s => selectedFruitsList.IndexOf(s.Name)).ToList();
它没有正确排序列表,我想根据selectedFruits订购CrateOrder列表项......
答案 0 :(得分:1)
你快到了。在所有其他项目之后,代码会从 要解决此问题,请撤消 或者,您可以扩展代码以明确处理否定索引:selectedFruitsList
订购水果,因为OrderBy
订单是升序的,并且它们是唯一返回非负数的订单。< / p>
selectedFruits
,并否定IndexOf
的结果,如下所示:string[] selectedFruits = {"Mango", "Apple"};
...
var sorted = cFruit.OrderBy(s => -selectedFruitsList.IndexOf(s.Name)).ToList();
string[] selectedFruits = {"Apple", "Mango"};
...
var sorted = cFruit.OrderBy(s => {
int index = selectedFruitsList.IndexOf(s.Name);
return index < 0 ? int.MaxValue : index;
}).ToList();
答案 1 :(得分:1)
如果您的水果的Name
属性与您的排序列表完全不符,IndexOf
将始终返回-1。要解决此问题,请指定不区分大小写的StringComparison
,但这不能作为IndexOf
的重载,因此您必须使用稍微复杂的方法:
var sorted = cFruit.OrderBy(
s => selectedFruitsList.FindIndex(
x => x.Equals(s.Name, StringComparison.OrdinalIgnoreCase)) )
.ToList();
答案 2 :(得分:1)
我不知道它是否区分大小写,我可以添加忽略文化吗
否 - Array.IndexOf
没有可让您自定义相等比较的参数。
只需将您的所有selectedfruits
和搜索值更改为小写:
string[] selectedFruits = {"Apple", "Mango"}; // in real get from web services
var selectedFruitsList = selectedFruits.Select(s => s.ToUpperInvariant()).ToList();
List<CrateOrder> cFruit = GetCrateOrderFromWebServices();
var sorted = cFruit.OrderBy(s => selectedFruitsList.IndexOf(s.Name.ToUpperInvariant())).ToList;