我有一个通用列表,我使用linq进行搜索:
NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault();
itemList.Where(elm => elm.UID == UID).SingleOrDefault().Read = true;
然后我继续使用item
的值调用WCF Web服务。
我这样做是因为我理解SingleOrDefault()返回一个新的IEnumerable,带有对象的副本。 (我误解了吗?)
列表通常不会很长,所以额外的迭代不是很重要,但它确实让我感到困扰。
我只是想不出一种巩固两次迭代的方法。 有什么想法吗?
答案 0 :(得分:4)
SingleOrDefault
不会返回IEnumerable而是返回单个项目。既然您已将其分配并保存在变量item
中,为什么不直接使用它进行进一步处理?
NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault();
item.Read = true;
您可以进一步简化此操作。而且,正如蒂姆所指出的,你需要一个空检查(见下面原因):
NotificationWindowItem item = itemList.SingleOrDefault(elm => elm.UID == UID);
if (item == null)
{
// ... some alternative or error handling code
}
else
{
item.Read = true;
}
扩展你的问题/不明智:
List<NotificationWindowItem>
,它实现了IEnumerable<NotificationWindowItem>
。IEnumerable<NotificationWindowItem>
并创建另一个只包含匹配元素的IEnumerable<NotificationWindowItem>
。IEnumerable<NotificationWindowItem>
并返回正常的,简单的单个NotificationWindowItem。 (更重要的是,它验证只有一个匹配元素。如果多个元素匹配则会引发异常。如果没有元素匹配,则返回default(T)
,在您的情况下为null
)。item
不 IEnumerable
。这是NotificationWindowItem
。背后没有魔法。这是一个简单的对象。它与LINQ没有任何关系。您只使用LINQ来检索它,但之后您可以对NotificationWindowItem的任何其他实例执行任何操作。答案 1 :(得分:1)
你可以这样做 - 不需要双循环。
var item = itemList.SingleOrDefault(elm => elm.UID == UID);
item.Read = true;
答案 2 :(得分:0)
你可以使用它,
NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault().toList();
解决您的问题。