5

我不确定我是否对array.where()的工作原理有正确的认识。我有一个充满 Spectrum.cs 对象的数组。每个光谱都包含一个文件名属性。

mySpectrum.文件名;//细绳

现在我有一个字符串值,我想将它与数组中的每个对象进行比较,以确定它是否具有相同的文件名。当我得到它时,它应该像这样工作:

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之间的区别在于多个匹配的结果:将引发异常,而or将分别采用第一个或最后一个匹配。FirstSingleLastSingleFirstLast

其中哪一个最合适将取决于您想要做什么。

于 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 回答