【问题标题】:List ordering - Extension method not firing!列表排序 - 扩展方法未触发!
【发布时间】:2009-03-26 03:36:08
【问题描述】:

我正在尝试像这样对列表进行排序:

public void Example()
{
    string target = "hello";

    List<string> myStings = new List<string>();

    myStings.Add("babab");
    myStings.Add("Helll");
    myStings.Add("atest");

    myStings.OrderBy(each => Distance(each, target));
}

public int Distance(string stringA, string stringB)
{
    // Whatever
}

问题是列表没有被排序并且Distance方法没有被触发(我在那里放了一个断点但没有被命中)。

任何帮助表示赞赏!

【问题讨论】:

    标签: c# linq extension-methods


    【解决方案1】:

    这是因为 Linq's Deferred Execution

    在 LINQ 中,查询的执行是 通常推迟到当 您实际上是在请求数据。

    因此,要查看您的方法是否有效,请将 ToList() 方法应用于您的 IOrderedEnumerable,以便您实际上是在请求数据,从而执行。

    myStings = myStings.OrderBy(each => Distance(each, target)).ToList();
    

    【讨论】:

    • 此解决方案强制延迟执行,以便调用距离但仍不会对 myStrings 进行排序。
    • 是的,这是真的;我只是强迫执行。我已经更新了答案,以便存储返回的排序列表
    【解决方案2】:

    myStings = myStings.OrderBy(each => Distance(each, target)).ToList();

    【讨论】:

    • String.Replace 的事情是因为字符串是不可变的
    • 虽然形式上有相似之处(即使原因不一样)
    【解决方案3】:

    你的

    myStrings.OrderBy(each => Distance(each, target));
    

    不会订购您的原始列表,它会返回有序列表。 你需要:

    myStrings = myStrings.OrderBy(each => Distance(each, target)).ToList();
    

    这将强制延迟执行并为您提供所需的结果。

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 2021-08-29
      • 2014-09-10
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多