C# 基于数组的排序列表
我试图根据字符串数组对自定义列表进行排序,但我失败得很惨,例如,它根本没有对列表进行排序C# 基于数组的排序列表,c#,arrays,sorting,C#,Arrays,Sorting,我试图根据字符串数组对自定义列表进行排序,但我失败得很惨,例如,它根本没有对列表进行排序 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
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();
Public类命令
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共流OrderStream{get;set;}
}
字符串[]selectedFruits={“Apple”,“Mango”};//真正从web服务中获取
var selectedFruitsList=selectedFruits.ToList();
List cFruit=GetCrateOrderFromWebServices();
var sorted=cFruit.OrderBy(s=>selectedFruitsList.IndexOf(s.Name)).ToList();
它没有对列表进行正确排序,我希望根据所选的水果来订购列表项…您就快到了。代码将水果从
selectedFruitsList
排序到所有其他项目之后,因为OrderBy
order是升序,并且它们是唯一返回非负数的项目
若要解决此问题,请反转所选的水果,并否定索引的结果,如下所示:
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();
string[]selectedFruits={“苹果”、“芒果”};
...
var sorted=cFruit.OrderBy(s=>{
int index=selectedFruitsList.IndexOf(s.Name);
返回索引<0?int.MaxValue:索引;
}).ToList();
如果水果的名称
属性与您的订购列表不完全匹配,IndexOf
将始终返回-1。要解决此问题,请指定一个不区分大小写的StringComparison
,但它不能作为IndexOf
的重载使用,因此您必须使用稍微复杂一点的方法:
var sorted = cFruit.OrderBy(
s => selectedFruitsList.FindIndex(
x => x.Equals(s.Name, StringComparison.OrdinalIgnoreCase)) )
.ToList();
我不知道它是否区分大小写,是否可以添加忽略文化
否-数组。IndexOf
没有用于自定义相等比较的参数
只需将所有选择的水果更改为小写:
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;
string[]selectedFruits={“苹果”、“芒果”};//真正从web服务中获取
var selectedFruitsList=selectedFruits.Select(s=>s.ToUpperInvariant()).ToList();
List cFruit=GetCrateOrderFromWebServices();
var sorted=cFruit.OrderBy(s=>selectedFruitsList.IndexOf(s.Name.ToUpperInvariant()).ToList;
我仍然不明白您是如何尝试将您的水果
与您的所选水果
进行排序的。cFruit
的输入和预期输出会有所帮助。这在我看来很好-也许我只是遗漏了同样的东西,但你确定你的cFruit列表项确实有与你选择的水果匹配的名称属性吗?这不是重复,这里还有其他问题。我怀疑这是一个区分大小写的问题,默认情况下,IndexOf
将执行区分大小写的搜索,除非指定其他规则。对我有效。。。您至少应该使用ToLowerInvariant
,但是“当您规范化字符串以进行比较时,请使用String.ToUpperInvariant方法而不是String.ToLowerInvariant方法”@Jamiec fair enough-modified。它进行了一些调整,例如OrderByDescending并将s.Name转换为Lower,我知道这不重要,但这就是它的工作原理,感谢StringComparison。OrdinalingOrecase
特别是不需要进行任何案例转换。我知道,但出于某种原因,它对我不起作用,我稍后会研究它,此时我太忙了:(给你:-工作完全正常,无需更改任何内容的大小写(注意名称有一些小写起始字母)