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

3
使用以下结构:
[[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;
  }
}

使用类似的Linq语句来实现相同的结果是什么?

11
安装 ReSharper,按 Alt+Enter 键在 foreach 上 :-) - Adam Houldsworth
@AdamHouldsworth:你曾经对丹尼尔的回答有过“评论”,但你已经将其删除了 :) - huMpty duMpty
1
@huMptyduMpty 是的,我做了,但我不喜欢太过于嘲讽或轻率。 :-) - Adam Houldsworth
@TimS.:OP的代码是有效的。这里的foreach自动将object转换为List<object> - Daniel Hilgarth
2
也许这只是一个糟糕的例子,但看起来你正在重新发明 Dictionary<TKey, TValue>。而且做得很差。 - JosephHirn
显示剩余2条评论
2个回答

8
var gift = gifts.Cast<List<object>>()
                .Where(x => x[0] == planYear)
                .Select(x => Convert.ToDouble(x[1]))
                .FirstOrDefault();

如果没有找到匹配的条目,gift 将是 0。如果这不是你想要的,请改用 First()。如果没有匹配项,它将抛出一个异常。
这个答案假设 - 就像你的 foreach 循环一样 - gifts 中的每个项目实际上都是 List<object> 类型。如果有一个以上的项目是不同类型的,这段代码就会抛出一个 InvalidCastException。如果这是一个问题,请使用 OfType 而不是 Cast

4
var gift = Convert.ToDouble(
               gifts.Cast<List<object>>().First(x => x[0] == planYear)[1]);

你需要使用.Cast<List<object>>(),但这比Daniel Hilgarth的答案更有效率。 - It'sNotALie.
@It'sNotALie:你为什么认为这个更有效率?两个答案都只将一个对象转换为double。 - Daniel Hilgarth
@Daniel 较少的方法调用/迭代器 - It'sNotALie.
@It'sNotALie.:是的,没错。不过我怀疑它未来会有什么影响。 - Daniel Hilgarth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接