2017-02-04 4 views
-5

最近DjikstraのShortest Pathアルゴリズムの実装をオンラインで見て、次の呼び出しを見つけました。 は、次の呼び出しは、次のようにC#では、大括弧内の2つのパラメータを使用して並べ替えを呼び出すのはどういう意味ですか?

nodes.Sort((x, y) => distances[x] - distances[y]); 

完全なコードがどういう意味int型のノードと種類の距離の辞書のリストを、与えられた:私は答えを探し

public List<int> shortest_path(int start, int finish) 
{ 
    var previous = new Dictionary<int, int>(); 
    var distances = new Dictionary<int, int>(); 
    var nodes = new List<int>(); 

    List<int> path = null; 

    foreach (var vertex in vertices) 
    { 
     if (vertex.Item1 == start) 
     { 
      distances[vertex.Item1] = 0; 
     } 
     else 
     { 
      distances[vertex.Item1] = int.MaxValue/2; 
     } 

     nodes.Add(vertex.Item1); 
    } 

    while (nodes.Count != 0) 
    { 
     nodes.Sort((x, y) => distances[x] - distances[y]); 

     var smallest = nodes[0]; 
     nodes.Remove(smallest); 

     if (smallest == finish) 
     { 
      path = new List<int>(); 
      while (previous.ContainsKey(smallest)) 
      { 
       path.Add(smallest); 
       smallest = previous[smallest]; 
      } 

      break; 
     } 

     if (distances[smallest] == int.MaxValue) 
     { 
      break; 
     } 

     foreach (var neighbor in vertices[smallest].Item2) 
     { 
      var alt = distances[smallest] + neighbor.Item2; 
      if (alt < distances[neighbor.Item1]) 
      { 
       distances[neighbor.Item1] = alt; 
       previous[neighbor.Item1] = smallest; 
      } 
     } 
    } 

    return path; 
} 

たくさんありますが、それが意味することの明確な説明がないようです。 一般的に、LINQでは、Array.Select((x、i)=> ...)の呼び出しは、xが配列内の実際の要素であり、iが配列内の要素xのインデックスであることを意味します。しかし、これは上記のようには見えません。

説明ありがとうございます。

+0

[ラムダ式](https://msdn.microsoft.com/en-us/library/bb397687.aspx) – Steve

+0

https://msdn.microsoft.com/en-us/library/w56d4y5z(v=vs) .110).aspxとlinqではありません – Nkosi

+0

http://stackoverflow.com/questions/4829054/what-does-this-c-sharp-code-with-an-arrow-mean-and-how-is-it -called?rq = 1 –

答えて

0

C#では、大カッコ内の2つのパラメータを使用して並べ替えを呼び出すのはどういう意味ですか?

あなたはこのコード行を持っている:

nodes.Sort((x, y) => distances[x] - distances[y]); 

あなたはソートメソッドに2つのパラメータを渡していないされていますが、2つのパラメータを取りデリゲートである一つのパラメータを渡しています。

var nodes = new List<int>(); 
nodes.Sort(SortIt); 

そして、ここではSortIt方法は次のとおりです:あなたは、本質的に従うが、ラムダ表記を使用してやっている

private int SortIt(int x, int y) 
{ 
    return distances[x] - distances[y]; 
} 

あなたは上記のアプローチを使用してそれをしなかった場合distancesがあります、覚えておいてくださいクラスレベルのフィールドになるようにして、SortItメソッドがそれにアクセスできるようにします。 ラムダ式では、これはあなたが持っているものです。キャプチャdistances変数です。これは、クロージャと呼ばれます。閉鎖が何であるか知りたい場合はthisの記事を読んでください。

+0

ありがとう、私はあなたの説明がこの質問に関する私の知識の根本的な欠点に対処すると思います。 – Realhermit

+0

私は助けになることができてうれしいです。私の答えがあなたの質問に答えるなら、[this](http://stackoverflow.com/help/someone-answers)を読んでください。 – CodingYoshi

0

並べ替えは、一度に2つの項目を比較することによって実装されます。

括弧内の2つのパラメータは、コールバック関数が比較す​​る2つの項目です。

0

List.Sortメソッドは、オプションの比較デリゲートを比較者として使用します。あなたの例では

https://msdn.microsoft.com/en-us/library/w56d4y5z(v=vs.110).aspx

:このメソッドは、指定されたSystem.Comparisonを使用して全体のリスト内の要素をソートします

(x, y) => distances[x] - distances[y]) is a delegate that Sort uses as a comparer. 

if distances[x] - distances[y] < 0; x is bigger; 

if distances[x] - distances[y] > 0; y is bigger; 

if distances[x] - distances[y] > 0; both are even; 
0

。 System.Comparisonは、デリゲート

public delegate int Comparison<in T>(
    T x, 
    T y 
) 

がソートメソッドに他の先例である配列のどの要素を決定する方法を渡している、このようにそれを考えている 。 sort関数は、指定したcompare関数を使用して、返されるソート済みリストの各要素の優先順位を決定します。したがって、この関数は2つの要素を取得し、優先度の結果を示す値を返します。

xを第1引数、yを第2引数とする。あなたはそれを並べ替える必要があります望むよう

x < y -> the function will return a number less than 0 
x = y -> the function will return 0 
x > y -> the function will return a number bigger than 0 

は結論として、あなたはSortメソッドに渡し、この関数は、配列をソートするソート機能を助けます。

+0

ありがとう、たくさんの意味がありました。 – Realhermit

関連する問題