0

私が見た数行のコードに少し混乱していると思います。

最初の1つ:

      IEnumerable<SignalViewModel> SelectionQuery =
            from SignalViewModel svm in AvailableSignalsListView.SelectedItems
            orderby AvailableSignalsListView.Items.IndexOf(svm)
            select svm;

      _GraphViewerViewModel.SelectAvailableSignals(SelectionQuery);

orderby がここで定義されているので、私には理にかなっています: http://msdn.microsoft.com/en-us/library/bb534966%28v=vs.110%29.aspx

ソースとキーセレクターを取ります。クエリ部分 orderbyAvailableSignalsListView.Items.IndexOf(svm)がラムダ式を作成して呼び出すと推測しています

Enumerable.OrderBy<TSource, TKey> Method (IEnumerable<TSource>, Func<TSource, TKey>)

IEnumerable<TSource>beingとbeing はAvailableSignalsListView.SelectedItemsFunc<TSource, TKey>次の行に沿ってクエリ ステートメントから作成されたラムダ式です。

svm => AvailableSignalsListView.Items.IndexOf(svm);

詳細についての私の理解が正しいかどうかはわかりませんが、これは私には理にかなっています。

二つ目、

List<SignalViewModel> mySelectedItems = new List<SignalViewModel>();

      //sort version
      foreach (SignalViewModel svm in AvailableSignalsListView.SelectedItems)
      {
        mySelectedItems.Add(svm);
      }
      mySelectedItems.Sort((x,y) => AvailableSignalsListView.Items.IndexOf(x).CompareTo(AvailableSignalsListView.Items.IndexOf(y)));

sort は icomparer を使用するため意味がありません。icomparer が必要とするのは、そのインターフェイスで定義された関数 (2 つの項目を取り、int を返す) だけであることは認められます。しかし、コンピュータはどのようにして、舞台裏でデリゲートに与える関数名を知るのでしょうか? または、インターフェイスは実際に関数の名前を気にしませんか?

4

1 に答える 1

1

にはいくつかのオーバーロードがありますList.Sort1 つIComparerインターフェイスを受け取り、もう 1 つComparisonはデリゲートを受け取ります。これは後者を使用しています。

インターフェイスのみを受け入れるメソッドがある場合、デリゲートを渡すことはできません。それはうまくいきません。

于 2013-11-13T21:02:38.207 に答える