15

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

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

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

4

6 回答 6

11
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
}
于 2018-09-07T03:13:43.410 回答
8

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

int index = myCollection.FindIndex(x => x.Param == "match condition");  
if (index != -1)
{
    myCollection[index]  = newObjectOfCollectionType;
}
于 2014-09-29T11:28:20.883 回答
5

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

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

T [] array = myCollection.ToArray();
array[index] = newObject;
于 2013-04-04T13:22:56.577 回答
2

它返回集合中的值。但是,就您而言,该值是参考。

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

于 2013-04-04T13:23:52.310 回答
1

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

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

obj  = newObjectOfCollectionType

无论序列的项目类型如何,都对序列内容不做任何事情。

于 2013-04-04T13:25:09.440 回答
1

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

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

C# 语言规范状态 (8.8.4)

“迭代变量对应于一个只读局部变量,其范围延伸到嵌入式语句。”

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

于 2020-01-19T14:15:13.837 回答