c#Linq List <t> .Where()。ToList()创建<t>的新实例

时间:2016-11-10 16:27:16

标签: c# linq

我有一个班,解决方案。 我使用这个课程作为一个我不想不必要地增长的列表。

我搜索列表以获取预先存在的条目并返回 - 或 - 如果需要,创建一个新条目:

var s0 = _solutions.Where(x => x.strtId == strtNodeId && x.endId == endNodeId).ToList();

但是,当where为true时,Linq实际上会创建新实例。 但是,正如您可能已经看到的那样,这不是我想要的。

x.startNode && x.endNode的组合在_solution

的所有实例中都是唯一的

最后我需要的是对_solution搜索的一个实例的引用,如果它已经存在的话。

但除了创建自己的for loop / s之外我还能做些什么?

感谢。

4 个答案:

答案 0 :(得分:2)

我认为您正在尝试从列表中创建一个类工厂,如果一个实例不存在,将创建一个新实例,如果存在,则返回一个单例实例?

在这种情况下,忘记列表并创建一个静态类工厂,而不是用新创建的类实例更新它的内部列表。

答案 1 :(得分:2)

来自评论:

如果_solutionsIEnumerable<Solution>,如果Solution是引用类型(class,而不是struct),那么新的不正确Solution的实例已创建!您只需使用Solution的“IEnumerable<>现有实例的引用。

你的前提一定是错的;如果List<>被增强,它就会发生在其他地方。您可以使用System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(s‌​ol) solSolution(引用类型)来获取某种“参考号”。或者,如果您有两个,请检查(object)sol1 == (object)sol2。如果您的类未覆盖EqualsGetHashCode并且不会重载operator ==,则可以简化这些表达式。

答案 2 :(得分:1)

您可能希望使用Single代替Where

如果您不确定该集合中是否存在该元素,您甚至可以使用SingleOrDefault

答案 3 :(得分:0)

为什么不这样做或者我不理解你。

var result = _solutions.FirstOrDefault(x => x.strtId == strtNodeId && x.endId == endNodeId);

var someValue = result?.SomeProperty;