2010-10-03 47 views
2

我需要一些澄清。这两种方法是相同还是不同?我对于根据值传入参数的对象的引用何时更新以及何时创建新参数有点困惑。我知道这个任务是否会创建一个新的参考,但是如何更改一个属性呢?这两种方法是否会以同样的方式更新字段“_someObjectList”?快速问题:C#Linq“单”语句与“for”循环

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; 
    } 
} 

回答

2

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

作为次要方面,你的两个方法实际上并不相同。如果序列中有多个匹配项目,则Single方法会引发异常。要正确匹配行为,请改为使用First


  1. “右值”实际上不是短期的“返回值”,它只是碰巧在这种情况下,你的右值是一个返回值,这就是为什么我指定这两个选项。
+0

我编辑了发布的代码,我认为它现在应该反映Single()而不是First()。请指教。感谢您的帮助。 如果您有时间可以请解释或提供关于您的评论的链接(如果SomeObject是一个结构体)。当我问这个时,我有Dictionary类(我相信从ICollection >派生出来)。 再次感谢。 – smartcaveman 2010-10-03 06:12:14

+0

答案在http://stackoverflow.com/questions/2414906/what-are-the-differences-between-value-types-and-reference-types-in-c/2414954#2414954简要解释了这种差异。 (请注意,问题中给出的'答案'的第一部分是错误的。)'Dictionary '可能是你想要的,而不是'List '。 – Zooba 2010-10-03 07:57:37

0

根据列表中的数据,它们可能会做同样的事情。 ReplaceItemPropertyValue2使用Single方法,如果itemUnqiueKey未找到或多次找到,将引发异常。

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

0

两者可能相同。

for循环中的算法在关键字匹配时设置对象,然后突然出现。

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