【问题标题】:Do interfaces not care about the name of the method when using Lambda expressions?接口在使用 Lambda 表达式时不关心方法的名称吗?
【发布时间】:2023-04-06 14:53:01
【问题描述】:

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

第一个:

      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

采用源和键选择器。我猜查询部分 orderby AvailableSignalsListView.Items.IndexOf(svm) 创建一个 lambda 表达式并调用

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

IEnumerable&lt;TSource&gt;AvailableSignalsListView.SelectedItems Func&lt;TSource, TKey&gt; 是从查询语句创建的 lambda 表达式,类似于

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)。但是,计算机如何知道在幕后给委托赋予什么函数名呢?还是接口实际上并不关心函数的名称?

【问题讨论】:

    标签: c# interface lambda delegates expression


    【解决方案1】:

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

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

    【讨论】:

    • 啊抱歉,不知何故我错过了,不知何故必须将比较器读作 icomparer。很高兴知道我不会发疯。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多