【问题标题】:Querying the min element using LINQ inside Tasks在任务中使用 LINQ 查询 min 元素
【发布时间】:2014-12-18 11:19:23
【问题描述】:

我对 LINQ 有点陌生,所以我在谓词方面遇到了困难,因此我需要你的帮助。 我有一个父任务返回我一个集合 ex:一个列表,List<CSample>。对象基本上可以表示如下:

public class CSample
{
        public double Distance { get; set; }
        public double XPosition { get; set; }
        public double Error { get; set; }
}

来到我的父任务,一旦我的所有子任务都执行完毕,我必须继续处理 CSample 集合项。

Task<List<CSample>> parent = new Task<List<CSample>>(() =>
 {

  results = new List<CSample>(); // list to store results
  //.. processing of child tasks in parallel
  return results;

  });

所以我的父任务继续进行其他处理(即在这种情况下找到 Error 值最小的项目。)

var cwt = parent.ContinueWith
                (p =>
                        {
                            if (p.Result != null && p.Result.Count > 0)
                            {
                               CSample processedData = (CSample )(p.Result.OrderBy(s => s.Error).FirstOrDefault());                              
                            }
                        }
                 );

但是,我的应用程序在这一行抛出了一个对象空引用异常,s is null

CSample processedData = (CSample )(p.Result.OrderBy(s => s.Error).FirstOrDefault());

这是我使用谓词查找具有最小错误值的项目的正确方法吗?

【问题讨论】:

    标签: linq c#-4.0 parallel-processing task-parallel-library


    【解决方案1】:

    您只对一个元素(可能是非空元素)感兴趣,因此请在调用 OrderBy 之前尝试过滤掉空值:

    CSample processedData = (CSample)(p.Result
        .Where(s => s != null)
        .OrderBy(s => s.Error)
        .FirstOrDefault());
    

    这将保证 s.Error 不会产生空引用异常,因为 s 永远不会为空。

    【讨论】:

    • 感谢您快速且有效!我只是不知道我可以这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多