FirstOrDefault是否返回对集合中项目的引用或值?

时间:2013-04-04 13:21:45

标签: c# linq

FirstOrDefault是否返回对集合中项目的引用或项目的值?

var obj = myCollection.FirstOrDefault(x => x.Param == "match condition");  
if (obj != null)
{
    obj  = newObjectOfCollectionType; //if found, replace with the changed record
}

此代码是否会将myCollection中的对象引用替换为新对象,还是对myCollection不执行任何操作?

5 个答案:

答案 0 :(得分:4)

它对集合没有任何作用。您可以像这样更改集合:

int index = myCollection.FindIndex(x => x.Param == "match condition");  
if (index != -1)
{
    myCollection[index]  = newObjectOfCollectionType;
}

答案 1 :(得分:4)

var obj = myCollection.FirstOrDefault(x => x.Param == "match condition");  
if (obj != null)
{
    obj  = newObjectOfCollectionType; --> this will not reflect in the collection
}

var obj = myCollection.FirstOrDefault(x => x.Param == "match condition");  
if (obj != null)
{
    obj.Property = newValue; --> this will reflect in your object in the original collection
}

答案 2 :(得分:3)

它什么都不做; obj是对象的引用(如果集合是引用类型),而不是对象本身 如果集合是基本类型,则obj将是集合中值的副本,并且,这意味着集合不会更改。

编辑:
要替换对象,它取决于您的收藏品的类型 如果它是IEnumerable<T>,那么它不可变,你将无法改变它 您拥有的最佳选择是创建一个新集合并对其进行修改,如此 -

T [] array = myCollection.ToArray();
array[index] = newObject;

答案 3 :(得分:2)

它返回集合中的值。但在你的情况下,这个值是一个参考。

它没有返回位置。您的代码不会更改集合。

答案 4 :(得分:1)

如果序列是引用类型序列,则返回引用。否则,返回值。

但是,无论如何,这一行:

obj  = newObjectOfCollectionType

对序列内容不做任何处理,无论序列的项目类型如何。