【问题标题】:C#: Sorting with anonymous functionC#:使用匿名函数排序
【发布时间】:2011-01-08 11:37:49
【问题描述】:

假设我有一个对象列表,我想按项目 DateModified 属性对其进行排序。为什么我不能使用这样的委托?如果不是如下所示,我应该如何按 DateModified 对它们进行排序:

public string SortByDateModified(List<CartItem> items)
{
    items.Sort(new Func<CartItem, CartItem, bool>((itemA, itemB) =>
    {
        return itemA.DateModified < itemB.DateModified;
    }));
}

【问题讨论】:

  • 我假设您为了演示目的而缩短了函数?因为它应该返回一个字符串但不返回任何内容。
  • 是时候选择一个答案了:)

标签: c# sorting


【解决方案1】:

为什么不使用 lambda 表达式?

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified)); 
} 

【讨论】:

  • 当然。 Jeff 的回答是正确,但是yuck。 lambda 干净得多。
  • 一个小笔记,你错过了) :)
  • 这是需要注意的 - 您必须针对 .Net 3.5 或更高版本。如果您出于兼容性原因以 2.0 为目标,则必须使用委托答案。
  • 偏好问题。一些开发者不喜欢 lambda 表达式。
  • @Karlth,这是 5 年前发布的有效声明。在这个阶段避免使用 lambda 表达式是很愚蠢的。如果您不想接受新事物,不妨使用 Fortran 或 Cobol 进行编程。
【解决方案2】:

如果您不想使用 lambdas 或高于 .NET 2.0,请使用:

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort(delegate(CartItem itemA, CartItem itemB) 
    { 
        return itemA.DateModified.CompareTo(itemB.DateModified); 
    }); 
} 

根据我的经验,在 Unity 等环境中,lambda 甚至委托都可能导致崩溃或问题,尤其是在 iOS 等平台上。在这种情况下,您可能希望使您的分拣机成为一个单独的函数,如下所示:

int SortCartItemFunction(CartItem itemA, CartItem itemB) 
{ 
    return itemA.DateModified.CompareTo(itemB.DateModified); 
} 

然后你可以像这样将它传递给你的排序调用:

items.Sort(SortCartItemFunction);

【讨论】:

  • 1+ 但达到投票上限:(
  • 谢谢。 Lambdas 使我的代码非常不可读,并且难以发展:[我需要对未知类型的对象进行排序,并根据您的提示在 .net 应用程序中使用委托。 list_array.Sort(delegate (CObj x, CObj y) { return Comparer.DefaultInvariant.Compare( typeof(CObj).GetProperty(str_name).GetValue(y, null), typeof(CObj).GetProperty(str_name)。 GetValue(x, null) ); });
【解决方案3】:

Sort 方法接受一个名为 Comparison&lt;T&gt; 的委托。您正在尝试传入一个Func&lt;int, int, bool&gt;,它本身就是一个代表。委托Func&lt;int, int, bool&gt;和委托Comparison&lt;T&gt;之间没有转换。

但是,您可以使用 lambda expression

items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified));

确实,您可以使用这个 lambda 表达式并将其传递给 Func&lt;int, int, bool&gt; 构造函数*。但是,没有必要。 lambda 表达式可以转换为签名匹配的任何委托 - 即 (a, b) =&gt; a.DateModified.CompareTo(b.DateModified) 可以分配给类型为 Func&lt;int, int, int&gt; 或类型为 Comparison&lt;T&gt; 的东西。在这种情况下,我们将它传递给需要 Comparison&lt;T&gt; 的东西。

* 稍作调整。 Sort 期望一个整数作为返回类型。负值表示小于,0 表示相等,正值表示大于。

【讨论】:

    【解决方案4】:

    bool 在这样的委托中没有用处,通常使用int,因为您需要 3 个值来表示比较的结果,小于、等于和大于。 .NET 集合通常(如果不总是)假定 -1 表示小于,0 表示等于,1 表示大于。

    然后,您必须在您的委托中检查值 x 是否小于、等于或大于值 y。这里要注意的一件有趣的事情是,如果您翻转结果,例如将 y 与 x 进行比较,您将按相反的方向排序。

    如需对日期进行排序的最简单方法,请查看JohnC's answerSam's

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多