【问题标题】:Quick Question: C# Linq "Single" statement vs "for" loop快速问题:C# Linq“单”语句与“for”循环
【发布时间】:2023-03-11 16:17:01
【问题描述】:

我需要澄清一下。这两种方法是相同的还是不同的?我对何时更新对按值传入参数的对象的引用以及何时创建新对象感到有些困惑。我知道该分配是否会创建一个新引用,但是更改属性呢?这两种方法会以相同的方式更新字段“_someObjectList”吗?

 public class SomeObject{
     public Guid UniqueKey { get; set; }
     public object SomeProperty{ get; set; }
 }

 public class SomeObjectListWrapper{

    public SomeObjectListWrapper(List<SomeObject> someObjectList){
        _someObjectList = someObjectList;
    }

    private readonly List<SomeObject> _someObjectList;

    public void ReplaceItemPropertyValue1(Guid itemUniqueKey, object propertyValue)
    {

        List<int> resultIndices = new List<int>();
        for (var i = 0; i < _someObjectList.Count(); i++)
        {
            if (_someObjectList[i].UniqueKey == itemUniqueKey)
                resultIndices.Add(i);
        }

        if (resultIndices.Count != 1)
            throw new Exception(
                "just pretend this is the same exception as Single() throws when it can't find anything");
        _someObjectList[resultIndices[0]].SomeProperty = propertyValue;
    }

    public void ReplaceItemPropertyValue2(Guid itemUniqueKey, object propertyValue)
    {
        _someObjectList.Single(x=>x.UniqueKey==itemUniqueKey).SomeProperty=propertyValue;
    }
}

【问题讨论】:

    标签: c# linq for-loop parameter-passing


    【解决方案1】:

    因为SomeObject 是一个类(即引用类型),两个ReplaceItemPropertyValue 方法都在更新插入到列表中的同一对象,稍后将从列表中检索。 (如果SomeObject 是结构/值类型,编译器会阻止您更新右值/返回值 [1]。)

    作为一个小旁注,您的两种方法实际上并不相同。如果序列中有多个匹配项,Single 方法会引发异常。要正确匹配行为,请改用First


    1. “rvalue”实际上并不是“return value”的缩写,只是碰巧在这种情况下您的 rvalue 是一个返回值,这就是我指定这两个选项的原因。

    【讨论】:

    • 我编辑了发布的代码,我认为它现在应该反映 Single() 而不是 First()。请指教。谢谢您的帮助。如果您有时间,请解释或提供有关您的评论的链接(如果 SomeObject 是一个结构)。当我问这个问题时,我有 Dictionary 类(我相信源自 ICollection>)。再次感谢。
    • stackoverflow.com/questions/2414906/… 的答案简要说明了差异。 (请注意,问题中给出的“答案”的第一部分是错误的。)Dictionary&lt;Guid,SomeObject&gt; 可能是您想要的,而不是 List&lt;SomeObject&gt;
    【解决方案2】:

    根据您列表中的数据,他们可能会做同样的事情。 ReplaceItemPropertyValue2 使用 Single 方法,如果 itemUnqiueKey 未找到或多次找到,则会抛出异常。

    但只要 itemUniqueKey 不能在列表中多次出现,这两个函数就应该完成相同的任务。

    【讨论】:

      【解决方案3】:

      两者可能相同。

      for 循环中的算法在键匹配时设置对象然后爆发。

      虽然 LINQ 语句会将对象设置为键匹配的所有条目。这取决于您的收藏是否多次输入了相同的密钥。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        • 2015-10-30
        • 1970-01-01
        • 2011-03-10
        • 2017-03-08
        • 2014-02-14
        • 2022-11-17
        相关资源
        最近更新 更多