5

array.where()がどのように機能するかについて正しい考えを持っているかどうかはわかりません。Spectrum.cs オブジェクトで満たされた配列があります。各スペクトルにはファイル名プロパティが含まれています。

mySpectrum.filename; //弦

これで、配列内の各オブジェクトと比較して、ファイル名が同じかどうかを確認したい文字列値ができました。私が得たように、次のように動作するはずです:

Spectrum bgSpec = new Spectrum(); //Has a filename
Spectrum[] currentSpectra;  //Array filled with Spectra

//Somehow this doesn't seem to work. Propably due to the returnvalue for where() which seems //to be IEnumerable.
Spectrum tempSpectrum = currentSpectra.Where<Spectrum>(c => c.filename == bgSpec);

私はおそらくすべてが間違っていたので、誰かがそれが何であるか、またはそれを正しく行う方法を指摘できれば非常に感謝しています.

前もって感謝します、BC++

4

4 に答える 4

11

その基準を満たす単一の値を探しているようです。だから多分使用Single

var tempSpectrum = currentSpectra.Single(c => c.filename == bgSpec.filename);

その他のオプション:

一致する要素がない場合、バージョンOrDefaultが返されます。とnullの違いはFirst、複数の一致の結果に関するものです。は例外をスローしますが、orはそれぞれ最初または最後の一致を取得します。SingleLastSingleFirstLast

これらのうちどれが最も適切かは、正確に何をしたいかによって異なります。

于 2012-05-25T10:54:15.273 に答える
4

Where入力シーケンスをサブセットに絞り込みます。それはまさにあなたがここで望んでいるものではありません。

var tempSpectrum = currentSpectra
                   .SingleOrDefault(c => c.filename == bgSpec.Filename);

SingleOrDefaultそのようなスペクトルが存在しない場合は、Spectrum探しているインスタンス、または (Spectrumが参照型であると仮定して) のいずれかを返します。null検索パラメータに一致するスペクトルが複数ある場合にも、例外がスローされます。

これが希望どおりでない場合は、Singleand First/も調べてくださいFirstOrDefault

これらのほとんどに非 LINQ の代替手段もあり、Array.Findさらにいくつかの静的Array.FindXメソッドがあります。

于 2012-05-25T10:54:27.270 に答える
2

ジョンが言ったように、ここでSingleは適切です。条件に一致する複数のスペクトル オブジェクトがある場合は、代わりにスペクトル オブジェクトのリストを使用する必要があります。filenameまた、プロパティを比較する必要があります

IEnumerable<Spectrum> tempSpectrums = currentSpectra.Where(c => c.filename == bgSpec.filename);
Spectrum tempSpectrum = currentSpectra.SingleOrDefault(c => c.filename == bgSpec.filename);

Whereまた、Single,などのメソッドのジェネリック型を指定する必要がないことにも注意してくださいSingleOrDefault。型はコレクション型からコンパイラによって推測されます。

于 2012-05-25T10:54:11.023 に答える
1

の代わりにSingleorを使用SingleOrDefaultしますLINQWhere

var tempSpectrum = currentSpectra.SingleOrDefault(c => c.filename == bgSpec.filename); 
于 2012-05-25T11:10:18.940 に答える