2009-03-26 21 views
1

は、私はこのようなリストをソートしようとしています:リストの順序付け - 拡張メソッドは起動しません!

public void Example() 
{ 
    string target = "hello"; 

    List<string> myStings = new List<string>(); 

    myStings.Add("babab"); 
    myStings.Add("Helll"); 
    myStings.Add("atest"); 

    myStings.OrderBy(each => Distance(each, target)); 
} 

public int Distance(string stringA, string stringB) 
{ 
    // Whatever 
} 

問題は、リストが注文されないとの距離方法はクビにしないこと(私はそこにブレークポイントを置くのではなくあります打撃を受けます)。

答えて

3

これは、理由はLINQでLinq's Deferred Execution

の、クエリの実行が 通常、あなたが実際にデータを要求 瞬間まで延期されています。あなたはは、実際にデータを要求されるように

だから、あなたのメソッドの動作を確認するために、あなたの IOrderedEnumerableToList()方法を適用するため、実行が行われます。

myStings = myStings.OrderBy(each => Distance(each, target)).ToList(); 
+0

この解決策は、距離が呼び出されるが、myStringはまだソートされないように遅延実行を強制します。 – trampster

+0

はい、そうです。私は実行を強制していただけだった。返されたソートされたリストが格納されるように答えを更新しました。 –

1

myStings = myStings.OrderBy(each => Distance(each、target))。ToList();

+0

omg - もう古い文字列はありません.replace trick ... thanks! – JohnIdol

+0

string.replace? –

+0

String.Replaceは文字列が不変であるためです –

1

あなた

myStrings.OrderBy(each => Distance(each, target)); 

は文句を言わない、それは順序付きリストを返すあなたの元のリストを注文します。 あなたが必要:

myStrings = myStrings.OrderBy(each => Distance(each, target)).ToList(); 

が、これは場所を取るし、あなたが必要との結果を与えることを遅延実行を強制します。