C#如何比较LINQ中Object和Dictionary中的2个值

时间:2015-02-04 17:53:47

标签: c# linq dictionary

我试图从字典中获取一个具有最小值和bool的对象,是否已经检查过。

var minTile = (from i in openedGridTIle  let  minCost = openedGridTIle.Min(m => m.Value.TotalCost)                           
where i.Value.TotalCost == minCost select i).FirstOrDefault();

通过LINQ的一个请求它工作正常,我可以获得具有最小值的对象,如果未检查对象,如何获得具有最小值的对象?

我的尝试:

var minTile = (from i in openedGridTIle  let  minCost = openedGridTIle.Min(m => m.Value.TotalCost)                           
          where i.Value.TotalCost == minCost select i).FirstOrDefault();
          //&&
          //(from b in openedGridTIle let chekVal = openedGridTIle.Select( f => !f.Value.Walkable )
          //    where b.Value.Walkable = chekVal select b).FirstOrDefault());

但它不起作用?可以在两个请求中做到吗?

1 个答案:

答案 0 :(得分:1)

我相信您正在尝试根据最低TotalCost找到价值,之后您尝试针对bool字段添加支票。您可以将原始查询缩短为:

var minTile = openedGridTIle.Values
                      .OrderBy(m=> m.TotalCost)
                      .FirstOrDefault();

稍后,如果您想针对bool值添加检查,则可以执行以下操作:

var minTile = openedGridTIle.Values
                      .OrderBy(m=> m.TotalCost)
                      .FirstOrDefault(f=> f.Walkable == false);

var minTile = openedGridTIle.Values
                      .OrderBy(m=> m.TotalCost)
                      .FirstOrDefault(f=> !f.Walkable);

您也可以在两个请求中执行此操作,例如:

var minTile = openedGridTIle.Values.Min(r=> r.TotalCost);

var items = openedGridTIle.Values
                          .Where(r=> r.TotalCost == minTile 
                                     && !r.Walkable);

您将获得IEnumerable<T>个项目。如果您只对单个项目感兴趣,则可以向项目添加FirstOrDefault(),或将Where替换为FirstOrDefault,因为它也会接受谓词。