c# Linq List. where (). tolist()创建的新实例
本文关键字:新实例 实例 创建 Linq where List tolist | 更新日期: 2023-09-27 18:17:31
我有一个类,Solution。我使用这个类作为List,我不想让它不必要地增长。
我搜索列表以获得一个预先存在的条目并返回-或者-如果需要创建一个新条目:
var s0 = _solutions.Where(x => x.strtId == strtNodeId && x.endId == endNodeId).ToList();
然而,Linq实际上会在where为true时创建新的实例。但是,正如您可能已经看到的,这不是我想要的。
x.startNode && x.endNode
的组合在_solution
的所有实例中是唯一的
如果_solution已经存在,那么最后我需要的是对正在搜索的_solution实例的引用。
但是除了创建自己的for循环/s之外,我还能做什么呢?谢谢。
您可能需要使用Single而不是Where
。
如果你不确定元素是否存在,你甚至可以使用SingleOrDefault
我认为你正在尝试创建一个类工厂的列表,其中一个新的实例将被创建,如果一个不存在或返回一个单例实例,如果一个存在?
在这种情况下,忘记list,而是创建一个静态类工厂,用新创建的类实例更新它的内部列表。
从注释中提升:
如果_solutions
是IEnumerable<Solution>
,如果Solution
是引用类型(class
,而不是struct
),那么创建Solution
的新实例是不正确的!您只需使用对Solution
的现有实例的引用,这些实例是从IEnumerable<>
"产生"的。
你的前提一定是错的;如果List<>
被增强,则发生在其他地方。您可以使用System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(sol)
,其中sol
是Solution
(引用类型),以获得一种"引用编号"。或者如果你有两个,检查(object)sol1 == (object)sol2
。如果您的类不覆盖Equals
和GetHashCode
,也不重载operator ==
,则可以简化这些表达式。
为什么不这样做呢?不然我就没听懂你的意思。
var result = _solutions.FirstOrDefault(x => x.strtId == strtNodeId && x.endId == endNodeId);
var someValue = result?.SomeProperty;