C# 如何将foreach循环转换为Linq查询?

C# 如何将foreach循环转换为Linq查询?,c#,linq,C#,Linq,结构如下 [[1,10],[2,20],[5,45],[10,34]] 这个foreach循环查找与“planYear”匹配的第一个元素。如果planYear=5,则将选择第三个元素值“45” List<object> gifts = gifts; foreach (List<object> item in gifts) { if (item[0] == planYear) { gift = Convert.ToDouble(item[1]);

结构如下

[[1,10],[2,20],[5,45],[10,34]]
这个foreach循环查找与“planYear”匹配的第一个元素。如果planYear=5,则将选择第三个元素值“45”

List<object> gifts = gifts;
foreach (List<object> item in gifts)
{
  if (item[0] == planYear)
  {
    gift = Convert.ToDouble(item[1]);
    break;
  }
}
列出礼物=礼物;
foreach(礼品中的列表项)
{
如果(项目[0]==计划年)
{
礼品=兑换成双份(第[1]项);
打破
}
}
要获得相同的结果,类似的Linq语句是什么?

var gift=gifts.Cast()
var gift = gifts.Cast<List<object>>()
                .Where(x => x[0] == planYear)
                .Select(x => Convert.ToDouble(x[1]))
                .FirstOrDefault();
.其中(x=>x[0]==计划年) .Select(x=>Convert.ToDouble(x[1])) .FirstOrDefault();
如果没有找到匹配的条目,则礼品将
0
。如果这不是您想要的,请使用
First()
。如果不存在匹配项,这将引发异常

这个答案假设-,就像你的
foreach
循环一样-
礼物
中的每一项实际上都是一个
列表
。如果哪怕是一个项目的类型不同,此代码也会抛出一个
InvalidCastException
。如果这是一个问题,请使用类型的
而不是
Cast

var gift=Convert.ToDouble(
var gift = Convert.ToDouble(
               gifts.Cast<List<object>>().First(x => x[0] == planYear)[1]);
gives.Cast()首先(x=>x[0]==planYear[1]);
Install ReSharper,Alt+Enter on
foreach
:-)@AdamHouldsworth:daniels的答案当时你有
评论,你删除了:)@huMptyduMpty是的,但我不喜欢太表面沙哑或轻率:-)这里的类型有点混乱……是
列出礼物还是什么?因为你不能让
列出礼物=礼物
foreach(礼物中的列表项)
其中
礼物
是一个
列表
。也许这只是一个不好的例子,但看起来你正在重新发明
字典
。糟糕。你需要
.Cast()
,但这比丹尼尔·希尔加思的答案更有效。@It'sNotALie:你为什么认为这一个更有效?两个答案都只将一个对象转换为双精度对象。@Daniel Less方法调用/iterators@It斯诺塔利:是的,没错。不过,我怀疑它是否有意义。