0

我想我对我看到的几行代码感到有些困惑。

第一个:

      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)创建了一个 lambda 表达式并调用

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

存在 和IEnumerable<TSource>存在是从查询语句创建的 lambda 表达式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 只需要一个由其接口定义的函数(它接受两个项目并返回一个 int)。但是,计算机如何知道在幕后给委托赋予什么函数名呢?还是接口实际上并不关心函数的名称?

4

1 回答 1

1

有几个重载List.Sort一个接受IComparer接口,一个接受Comparison委托。这是使用后者。

如果你有一个只接受接口的方法,你就不能传入委托;那是行不通的。

于 2013-11-13T21:02:38.207 回答