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

本文关键字:引用 是否 返回 集合 FirstOrDefault | 更新日期: 2023-09-27 18:07:28

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

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

这段代码会用新对象替换myCollection中的对象引用,还是对myCollection不做任何操作?

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

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
}

对集合不做任何操作。您可以这样更改集合:

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

它什么也不做;Obj是对象的引用(如果集合是引用类型),而不是对象本身。
如果集合是原始类型,那么obj将是集合中值的副本,这意味着集合不会更改。

编辑:
要替换对象,取决于集合的类型。
如果它是IEnumerable<T>,那么它是不可变的,你将无法改变它。
最好的选择是创建一个新的集合并修改它,像这样-

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

返回集合中的值。但是,在您的例子中,该值是一个引用。

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

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

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

obj  = newObjectOfCollectionType

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

Linq方法的源代码中使用了foreach迭代器,它返回IEnumerable集合中的元素。

foreach (TSource element in source) {
  if (predicate(element)) return element;
}

c#语言规范(8.8.4)

"迭代变量对应于一个只读的局部变量扩展到嵌入语句的作用域。"

也就是说我们得到一个只读元素。对于ref类型,readonly修饰符允许更改对象的条件,但不允许更改对象的引用。