我有一个班,解决方案。 我使用这个课程作为一个我不想不必要地增长的列表。
我搜索列表以获取预先存在的条目并返回 - 或 - 如果需要,创建一个新条目:
var s0 = _solutions.Where(x => x.strtId == strtNodeId && x.endId == endNodeId).ToList();
但是,当where为true时,Linq实际上会创建新实例。 但是,正如您可能已经看到的那样,这不是我想要的。
x.startNode && x.endNode
的组合在_solution
最后我需要的是对_solution搜索的一个实例的引用,如果它已经存在的话。
但除了创建自己的for loop / s之外我还能做些什么?
感谢。
答案 0 :(得分:2)
我认为您正在尝试从列表中创建一个类工厂,如果一个实例不存在,将创建一个新实例,如果存在,则返回一个单例实例?
在这种情况下,忘记列表并创建一个静态类工厂,而不是用新创建的类实例更新它的内部列表。
答案 1 :(得分:2)
来自评论:
如果_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 ==
,则可以简化这些表达式。
答案 2 :(得分:1)
您可能希望使用Single代替Where
。
如果您不确定该集合中是否存在该元素,您甚至可以使用SingleOrDefault。
答案 3 :(得分:0)
为什么不这样做或者我不理解你。
var result = _solutions.FirstOrDefault(x => x.strtId == strtNodeId && x.endId == endNodeId);
var someValue = result?.SomeProperty;