C# 通过列表避免两次迭代

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()返回一个新

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

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所指出的,您需要一个空检查(请参见下面的原因):

要详细说明您的问题/不确定性:

  • itemList是项目的列表。每个项目都是一个NotificationWindowItem。该列表实现IEnumerable接口。(更准确地说,我假设itemList是一个实现
    IEnumerable
    列表
  • 其中是一个扩展方法,它接受
    IEnumerable
    并创建另一个仅包含匹配元素的
    IEnumerable
  • SingleOrDefault接受一个
    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所指出的,您需要一个空检查(请参见下面的原因):

    要详细说明您的问题/不确定性:

  • itemList是一个项列表。每个项都是一个NotificationWindowItem。该列表实现IEnumerable接口。(更准确地说,我假设itemList是一个实现IEnumerable的
    list
  • 其中是一个扩展方法,它接受
    IEnumerable
    并创建另一个仅包含匹配元素的
    IEnumerable
  • SingleOrDefault接受一个
    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
    在存在多个元素时会引发异常。