2016-11-10 11 views
-3

私はクラスを持っています。 私は不必要に成長したくないリストとしてこのクラスを使用します。c#Linq List <T> .Where()ToList()は、<T>の新しいインスタンスを作成します。

私は、既存のエントリを取得するには、リストを検索し、必要であればそれは新しいエントリを作成する - または - 返す:真のどこにあるとき

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

しかし、LINQのは、実際に新しいインスタンスを作成します。 しかし、あなたがすでに見ているように、それは私が望むものではありません。

x.startNode && x.endNodeの組み合わせは、私が必要なものを終わりに_solution

のすべてのインスタンスで一意であることがすでに存在する場合、検索対象_solutionの1つのインスタンスへの参照です。

しかし、自分のforループを作成する以外に何ができますか?

ありがとうございました。

+3

あなたが検索したアイテムの新しいインスタンスがs0に含まれると思いますか? –

+3

これは、古いリストと同じ要素を持つ新しいリストを作成しています。新しい要素を作成しているわけではありません。これがあなたの質問に対処できない場合、私はその問題が何であるか不明です。 – Amy

+1

あなたの言っていることは本当にわかりません。何が作成されていますか?最後に 'List 'を作成していますが、作成された 'T 'の新しいインスタンスについて話しているようです。 – itsme86

答えて

1

Whereの代わりにSingleを使用します。

要素がコレクションに存在しないことがわかっている場合は、SingleOrDefaultを使用することもできます。

0

これを行わないと正しく理解できません。

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

var someValue = result?.SomeProperty; 
2

は、私はあなたが1が存在しないか、いずれかが存在しない場合はシングルトンインスタンスを返さない場合は、新しいインスタンスが作成されるリストのうち、クラスファクトリを作成しようとしていると思いますか?

この場合、リストを忘れて、静的なクラスファクトリを作成し、新しく作成されたクラスインスタンスで内部リストを更新します。 _solutionsIEnumerable<Solution>で、Solutionが参照型(class、ないstruct)であれば、Solutionの新しいインスタンスが作成されていることを正しくない場合

:コメントから昇格

+0

それは右に聞こえます – Steve

+0

あなたのが最高のアイデアですが、私はこの時にその努力に行きたいとは思っていません。これは公正な例だとお考えですか? http://stackoverflow.com/questions/515269/factory-pattern-in-c-how-to-ensure-an-object-instance-can-only-be-created-by-a私は1つのコンストラクタを持つ必要があります実際には同じクラスのインスタンスを受け取ることから始まります。このコンストラクタは、送信されたインスタンスのコピーを作成して新しいインスタンスを作成します。 – Steve

2

IEnumerable<>から "yielded"された既存のインスタンスSolutionへの参照を使用するだけです。

あなたの前提は間違っていなければなりません。 List<>が拡張されている場合は、別の場所で発生します。 System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(s‌​ol)を使用して、solSolution(参照タイプ)の場合は、「参照番号」の種類を取得できます。または、2つある場合は(object)sol1 == (object)sol2にチェックしてください。これらの式は、クラスがEqualsGetHashCodeをオーバーライドせず、operator ==をオーバーロードしない場合に簡略化できます。

関連する問題