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之外,我还能做什么呢?

谢谢。

c# Linq List<T>. where (). tolist()创建<T>的新实例

您可能需要使用Single而不是Where

如果你不确定元素是否存在,你甚至可以使用SingleOrDefault

我认为你正在尝试创建一个类工厂的列表,其中一个新的实例将被创建,如果一个不存在或返回一个单例实例,如果一个存在?

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

从注释中提升:

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

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

为什么不这样做呢?不然我就没听懂你的意思。

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