2016-06-17 3 views
0

私は、国リスト内の特定の国をリストの先頭に移動する効率的な方法を探しています。リスト内のアイテムを移動する<>

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

ので基本的に私は、リストの先頭に特定の国(米国、カナダ、メキシコ)を移動し、同じ順序で休息したいです。

国のリストは、実際には国名に関連付けられたIDを持つオブジェクトです。

+0

リストをソートするには、条件を含める必要があります。単に文字列のリストを持つだけでは、外部データソースなしで並べ替えのための多くのオプションを提供するつもりはありません。 –

答えて

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メソッドをオーバーライドするか、比較デリゲートを適切に調整する必要があります。

+0

解決策のシンプルさが大好きですが、私はこの 'listA.Concat(listB.Except(listA))。ToList()'が自分のニーズに合っていることを発見しました。 – BanTim

3

CountrySortOrderというフィールドを追加します。

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

は、その後、あなたはLINQ

を使用して List<Country>を並べ替えることができます
list.OrderBy(country => country.SortOrder); 
あなたは SortOrder=0として他のすべての国残し、それらの国のために負の数を追加することができます

ますトップに引っ張りたい

var countries = new List<Country>(); 
countries.Add(new Country { CountryName="USA", SortOrder = -1 }); 
関連する問題