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