0

我有一个通用列表,我使用 linq 进行搜索,如下所示:

NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault();
itemList.Where(elm => elm.UID == UID).SingleOrDefault().Read = true;

然后,我继续调用 WCF Web 服务,其值来自item. 我这样做是因为我的理解是 SingleOrDefault() 返回一个带有对象副本的新 IEnumerable。(我误会了吗?)列表通常不是很长,所以额外的迭代不是很重要,但它真的让我很烦恼。

我只是想不出一种方法来巩固这两个迭代。有任何想法吗?

4

3 回答 3

4

SingleOrDefault不返回 IEnumerable 而是返回单个项目。既然您已经分配并保存在您的变量item中,为什么不简单地使用它进行进一步处理呢?

NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault();
item.Read = true;

您可以进一步简化这一点。而且,正如 Tim 所指出的,您需要进行空值检查(原因见下文):

NotificationWindowItem item = itemList.SingleOrDefault(elm => elm.UID == UID);
if (item == null)
{
    // ... some alternative or error handling code
}
else
{
    item.Read = true;
}

要扩展您的问题/不明确之处:

  1. itemList 是项目列表。每个项目都是一个 NotificationWindowItem。该列表实现了 IEnumerable 接口。(更准确地说,我假设 itemList 是一个List<NotificationWindowItem>which implements IEnumerable<NotificationWindowItem>
  2. Where 是一个扩展方法,它采用IEnumerable<NotificationWindowItem>并创建另一个IEnumerable<NotificationWindowItem>只包含匹配元素的方法。
  3. SingleOrDefault 接受IEnumerable<NotificationWindowItem>并返回一个普通的、简单的、单一的 NotificationWindowItem。(更重要的是,它验证只有一个匹配的元素。如果有多个元素匹配,它将引发异常。如果没有元素匹配,则返回default(T)null的情况)。
  4. item不是一个。_ IEnumerable它是一个NotificationWindowItem. 背后没有魔法。这是一个简单的对象。它与 LINQ 没有任何关系。您只使用 LINQ 来检索它,但之后您可以对 NotificationWindowItem 的任何其他实例执行任何操作。
于 2012-07-11T13:34:57.287 回答
1

你可以这样做 - 不需要双循环。

var item = itemList.SingleOrDefault(elm => elm.UID == UID);
item.Read = true;
于 2012-07-11T13:37:12.883 回答
0

你可以用这个,

NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault().toList(); 

解决您的问题。

于 2012-07-11T14:23:36.313 回答