FirstOrDefault是否返回对集合中项目的引用或值?
FirstOrDefault是否返回对集合中项目的引用或项目的值?FirstOrDefault是否返回对集合中项目的引用或值?
var obj = myCollection.FirstOrDefault(x => x.Param == "match condition");
if (obj != null)
{
obj = newObjectOfCollectionType; //if found, replace with the changed record
}
将这段代码替换为新对象MyCollection的对象引用,还是会无助于MyCollection的?
它什么都不会做; obj是对象的引用(如果集合是引用类型的),而不是对象本身。
如果集合是原始类型,那么obj将是集合中值的副本,并且再次 - 这意味着集合不会更改。
编辑:
要取代对象,它取决于你的集合类型是什么。
如果它是IEnumerable<T>
,那么它是不可变的,你将无法改变它。
你最好的选择是创建一个新的集合和修改,像所谓
T [] array = myCollection.ToArray();
array[index] = newObject;
谢谢。如果对象在集合中退出,是否有更好的方法? – trashrobber 2013-04-04 13:25:45
我编辑了我的回答 – 2013-04-04 13:28:08
@sJhonny:这仍然不会改变'myCollection'。它只会改变'array'。 – 2013-04-04 13:36:49
它返回的集合中的价值。但是,在你的情况下,这个价值是一个参考。
它不返回位置。你的代码不会改变集合。
“在你的情况,是一个参考” - 为什么?项目的类型可以是具有'Param'属性的'struct'。 – Dennis 2013-04-04 13:27:26
@ Dennis:代码有'if(obj!= null)'。如果'obj'是一个值类型('struct'),那么这行代码就不会编译。 – 2013-04-04 13:44:53
如果序列是一系列引用类型,则返回引用。否则,返回该值。
但是,不管怎样,这条线:
obj = newObjectOfCollectionType
不做任何处理的顺序内容,无论序列的项目类型。
您可以更改收集这样的:
int index = myCollection.FindIndex(x => x.Param == "match condition");
if (index != -1)
{
myCollection[index] = newObjectOfCollectionType;
}
这似乎不能回答海报的问题,但我相信它解决了他们遇到的问题。它解决了我的!直到看到这篇文章,我才知道“FindIndex”。感谢帮助我的1位SO用户! LINQ是一个非常强大的! – 2015-12-11 18:14:15
您可以更改它返回的对象,但你不能取代它。所以如果你做了'obj.SomeProperty = newPropertyValue'之类的东西,它会更新你的集合中的对象。 – juharr 2013-04-04 13:27:20
序列是只读的,所以你不能改变它。您需要创建一个新的集合。 myCollection = mycollection.Select(x => x.Param ==“match condition”?newObjectOfCollectionType:x).ToList()//或ToArray/ToDictionary – adrianm 2013-04-04 13:35:11