基于Array排序列表

时间:2015-02-12 14:14:35

标签: 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 web services
var selectedFruitsList = selectedFruits.ToList();

List<CrateOrder> cFruit = GetCrateOrderFromWebServices();

var sorted = cFruit.OrderBy(s => selectedFruitsList.IndexOf(s.Name)).ToList();

它没有正确排序列表,我想根据selectedFruits订购CrateOrder列表项......

3 个答案:

答案 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;