我希望在CityName的基础上对List进行排序,以便使用CityName Lahore的记录首先出现在伊斯兰堡,然后是卡拉奇。 以下是供参考的源代码,
class Address {
private City;
}
class City{
private CityName;
}
我正在寻找一种方法来使用LINQ OrderBy方法。
答案 0 :(得分:4)
您可以使用List.IndexOf
:
IEnumerable<string> query = cityList.OrderBy(orderedCityList.IndexOf);
如果订单列表中未包含字符串,则IndexOf
会返回-1
,因此这些城市将成为第一个。如果您希望它们位于列表的末尾,您可以使用此查询:
IEnumerable<string> query = cityList
.Select(s => new { City = s, Index = orderedCityList.IndexOf(s) })
.OrderBy(x => x.Index >= 0 ? x.Index : int.MaxValue)
.Select(x => x.City);
答案 1 :(得分:2)
我建议映射(即将实际城市名称映射到所需的顺序):
Dictionary<string, int> order = new Dictionary<string, int> {
{"Lahore", 1},
{"Islamabad", 2},
{"Karachi", 3},
};
...
var result = myCollection
.OrderBy(city => order[city]);
如果您在myCollection
中有任意城市,并希望首先拥有Lahore
,Islamabad
,Karachi
(按此顺序),然后是所有其他城市:< / p>
var result = myCollection
.OrderBy(city => order.TryGetValue(item, out var map) ? map : int.MaxValue)
.ThenBy(city => city);
修改:为什么Dictionary
?字典在一般情况下是有效的,尤其是。如果您有长城市列表。要将列表转换为字典:
List<string> cities = new List<string>() {
"Lahore",
"Islamabad",
"Karachi",
};
Dictionary<string, int> order = cities
.Select((value, index) => new {value = value, index = index})
.ToDictionary(item => item.value, item => item.index);
然而,如果你能保证它只是少数(比如,3
)特殊城市,我的解决方案就是矫枉过正,Tim Schmelter的解决方案就更好了。