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
特别是不需要进行任何案例转换。我知道,但出于某种原因,它对我不起作用,我稍后会研究它,此时我太忙了:(给你:-工作完全正常,无需更改任何内容的大小写(注意名称有一些小写起始字母)