【问题标题】:What can I do with the IEnumerable(of T) result except iterate over it?除了迭代它之外,我可以用 IEnumerable(of T) 结果做什么?
【发布时间】:2013-12-05 07:49:25
【问题描述】:

好的,我是 Linq 的新手,我正在使用 VB.NET。给定具有 2 个属性的对象列表,称为 AttributeVariable 和 AttributeValue,我想为集合中具有特定 AttributeVariable 值的第一项选择 AttributeValue。这是我的开始:

Dim query = From c In items 
                 Where c.AttributeVariable = "thename" 
                 Select c.AttributeValue

酷,它有效,我可以为每个查询结果写出结果。

由于 c.AttributeValue 是一个字符串,将列表中的第一项(只有一个)分配给字符串变量的最简单方法是什么?

【问题讨论】:

  • 看到FirstOrDefault?无论如何,您可以做很多事情......就像在Enumerable extension methods 中找到的那些。
  • @user2864740,正确的方法语法,但他们正在使用查询语法。
  • @AshBurlaczenko 查询语法只是一个漂亮的包装器:(someQueryThatResultsInAnIEnumerable).FirstOrDefault() 可以正常工作。那么这只是如何/是否转换为查询语法的问题(它只是被编译器转换回方法调用)。我什至不知道如何用 just 查询语法编写它,这很好,因为它最终无关紧要。
  • (顺便说一句,我对标题投了反对票 - 确保标题总结了实际问题/问题。虽然 Enumerable 的基本操作是“迭代”,这可能会导致许多不同的查询和转换:过滤、映射、分组、跳过、聚合、连接……甚至只是获取第一个值,如果它存在的话。)

标签: vb.net linq


【解决方案1】:

FirstOrDefault 怎么样? (还有 SingleOrDefault 和采用默认值的重载;请参阅文档。)

返回序列的第一个元素,如果序列不包含任何元素,则返回默认值。

然后:

Dim attribute = (From c In items 
                 Where c.AttributeVariable = "thename" 
                 Select c.AttributeValue).FirstOrDefault()

关键是在 FirstOrDefault 之前选择了属性值(字符串) - 因此表达式的结果类型是字符串。

在任何情况下,虽然我不相信使用 just 查询语法可以做到这一点,但这不会造成问题,因为 (query) 返回一个 IEnumerable 然后可以使用使用如图所示的“普通”可枚举扩展方法。

【讨论】:

  • 对我来说,它们的关键实际上是 LINQ 语句周围的 () 以使 FirstOrDefault 可用。我喜欢标题的变化,点得好,我以后会做得更好。谢谢!
  • @user3067981 很高兴这个答案很有用——语法(尤其是在组合表单时)可能有点麻烦。我通常根本不使用查询语法。
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多