移动列表中的项目<>

时间:2016-06-17 21:16:47

标签: c# linq

我正在寻找有效的方法将国家/地区列表中的某些国家/地区移到列表顶部。

 List<Countries> {"Italy","Germany","USA","England","Canada","Mexico"}
 //do something
 List<Countries> {"USA","Canada","Mexico","Italy","Germany","England"}

所以基本上我想把某些国家(美国,加拿大和墨西哥)排在首位,并以相同的顺序休息。

国家/地区列表实际上是一个ID与国家/地区名称相关联的对象。

2 个答案:

答案 0 :(得分:3)

SortOrder添加名为Country的字段:

public class Country
{
    public string CountryName { get; set; }
    public int SortOrder { get; set; }
}

然后,您可以使用LINQ

List<Country>进行排序
list.OrderBy(country => country.SortOrder);

您可以将所有其他国家/地区设为SortOrder=0,并为想要拉到最顶层的国家/地区添加负数。

e.g。

var countries = new List<Country>();
countries.Add(new Country { CountryName="USA", SortOrder = -1 });

答案 1 :(得分:1)

您使用Linq标记了您的问题,但这不会修改现有的集合。你可以使用Linq创建一个具有不同标准的新集合,但这看起来并不像你在这里要求的那样。

这是使用List<T>类的Sort方法的一个简单解决方案:

var list = new List<string> {"Italy","Germany","USA","England","Canada","Mexico"};
// Items you want to pull to the front of the list, in reverse order
var toSort = new[] { "Mexico", "Canada", "USA" }; 
// Sort by index in toSort
list.Sort((x , y) => Array.IndexOf(toSort, y) - Array.IndexOf(toSort, x));

这将产生:

List<string> {"USA", "Canada", "Mexico", "Italy", "Germany", "England"};

注意:此示例使用string值。要将此方法用于自定义类,您必须覆盖Equals方法或适当调整比较委托。