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不做任何操作?
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修饰符允许更改对象的条件,但不允许更改对象的引用。