[英]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.