C# 通过列表避免两次迭代
我有一个通用列表,我使用linq进行搜索,如下所示:C# 通过列表避免两次迭代,c#,generics,linq-to-objects,C#,Generics,Linq To Objects,我有一个通用列表,我使用linq进行搜索,如下所示: NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault(); itemList.Where(elm => elm.UID == UID).SingleOrDefault().Read = true; 然后,我使用item中的值调用WCF web服务。 我这样做是因为据我所知,SingleOrDefault()返回一个新
NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault();
itemList.Where(elm => elm.UID == UID).SingleOrDefault().Read = true;
然后,我使用item
中的值调用WCF web服务。
我这样做是因为据我所知,SingleOrDefault()返回一个新的IEnumerable,其中包含对象的副本。(我误解了吗?)
列表通常不是很长,所以额外的迭代不是很重要,但它真的让我很烦
我只是想不出一种方法来整合这两个迭代。
有什么想法吗?SingleOrDefault不返回IEnumerable,而是返回单个项。既然您已经将其分配并保存在变量
项中
,为什么不直接将其用于进一步处理呢
NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault();
item.Read = true;
您可以进一步简化此操作。而且,正如Tim所指出的,您需要一个空检查(请参见下面的原因):
要详细说明您的问题/不确定性:
IEnumerable
的列表
IEnumerable
并创建另一个仅包含匹配元素的IEnumerable
IEnumerable
并返回一个普通、简单、单一的NotificationWindowItem。(除此之外,它还验证只有一个匹配的元素。如果多个元素匹配,它将抛出一个异常。如果没有匹配的元素,它将返回default(T)
,在您的情况下为null
)item
不是一个IEnumerable
。它是一个NotificationWindowItem
。它背后没有魔法。它是一个简单的对象。它与LINQ没有任何关系。您只使用LINQ检索它,但之后您可以对NotificationWindowItem的任何其他实例执行任何操作SingleOrDefault
不返回IEnumerable,而是返回单个项。既然您已经将其赋值并保存在变量item
中,为什么不直接将其用于进一步处理
NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault();
item.Read = true;
您可以进一步简化这个过程。而且,正如Tim所指出的,您需要一个空检查(请参见下面的原因):
要详细说明您的问题/不确定性:
list
IEnumerable
并创建另一个仅包含匹配元素的IEnumerable
IEnumerable
并返回一个普通、简单、单一的NotificationWindowItem。(除此之外,它还验证只有一个匹配的元素。如果多个元素匹配,它将抛出一个异常。如果没有匹配的元素,它将返回default(T)
,在您的情况下为null
)item
不是一个IEnumerable
。它是一个NotificationWindowItem
。它背后没有魔法。它是一个简单的对象。它与LINQ没有任何关系。您只使用LINQ检索它,但之后您可以对NotificationWindowItem的任何其他实例执行任何操作您可以这样做-不需要双循环
var item = itemList.SingleOrDefault(elm => elm.UID == UID);
item.Read = true;
您可以这样做-不需要双循环
var item = itemList.SingleOrDefault(elm => elm.UID == UID);
item.Read = true;
你可以用这个
NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault().toList();
来解决您的问题。您可以使用
NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault().toList();
来解决您的问题。您不能只使用item.Read=true吗?您不能只使用item.Read=true吗?如果给定UID没有NotificationWindowItem,您可能需要添加一个null检查。因此,该项是通过ref传递的?我觉得这个扩展方法复制了该对象。然后它比我想象的要简单:)@EladLachmi并不是说项是通过引用传递的,项本身是一个引用(因为它是一个类),所以按值复制它只是复制引用的另一个副本。@chiccodoro:+1旁注:第3点应以“返回单个NotificationWindowItem”结尾。您可能还想提到,
SingleOrdefault
如果有多个元素,则会引发异常。如果给定UID中没有NotificationWindowItem,则可能需要添加null检查。因此,该项是通过ref传递的?我认为此扩展方法复制了该对象。这样就更简单了n我想:)@EladLachmi并不是通过引用传递该项,该项本身是一个引用(因为它是一个类),所以通过值复制它只是复制引用的另一个副本。@chiccodoro:+1旁注:第3点应该以“返回单个NotificationWindowItem”结尾。您可能还想提到,SingleOrdefault
在存在多个元素时会引发异常。