簡體   English   中英

基於數組的排序列表

[英]Sort List based on Array

我正在嘗試根據字符串數組對自定義列表進行排序,但是我慘遭失敗,例如,它根本沒有對列表進行排序,

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();

它沒有正確排序列表,我希望CrateOrder列表項基於selectedFruits進行排序...

如果您的水果的Name屬性與您的訂購列表不完全匹配,則IndexOf將始終返回-1。 要解決此問題,請指定一個不區分大小寫的StringComparison ,但是它不能作為IndexOf的重載使用,因此您必須使用稍微復雜一點的方法:

var sorted = cFruit.OrderBy(
                     s => selectedFruitsList.FindIndex(
                            x => x.Equals(s.Name, StringComparison.OrdinalIgnoreCase)) )
                  .ToList();

你快到了。 該代碼從所有其他項之后將數據從selectedFruitsList排序,因為OrderBy順序是遞增的,並且它們是唯一為其返回非負數的水果。

要解決此問題,請反轉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();

我不知道它是否區分大小寫,是否可以在其中添加忽略區域性

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM