LINQ OrderBy基于条件

时间:2018-05-03 09:48:17

标签: c# linq

我希望在CityName的基础上对List进行排序,以便使用CityName Lahore的记录首先出现在伊斯兰堡,然后是卡拉奇。 以下是供参考的源代码,

class Address {
private City;
}
class City{
private CityName;
}

我正在寻找一种方法来使用LINQ OrderBy方法。

2 个答案:

答案 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中有任意城市,并希望首先拥有LahoreIslamabadKarachi(按此顺序),然​​后是所有其他城市:< / 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的解决方案就更好了。