究竟如何使用array.where
本文关键字:where array 何使用 究竟 | 更新日期: 2023-09-27 18:35:30
我不确定我是否对array.where()的工作原理有了正确的了解。我有一个充满 Spectrum.cs 对象的数组。每个频谱都包含一个文件名属性。
mySpectrum.filename;//String
现在我有一个字符串值,我想将其与数组中的每个对象进行比较,以确定它是否具有相同的文件名。正如我得到的,它应该像这样工作:
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++
看起来您正在寻找符合该标准的单个值。所以也许使用Single
:
var tempSpectrum = currentSpectra.Single(c => c.filename == bgSpec.filename);
其他选项:
-
First
-
FirstOrDefault
-
SingleOrDefault
-
Last
-
LastOrDefault
如果没有匹配的元素,OrDefault
版本将返回null
。First
、Single
和Last
之间的区别在于多场比赛的结果:Single
将抛出异常,而First
或Last
将分别进行第一场比赛或最后一场比赛。
其中哪一个最合适将取决于您要做什么。
>Where
将输入序列缩小到子集。这不是你想要的,这可能更像
var tempSpectrum = currentSpectra
.SingleOrDefault(c => c.filename == bgSpec.Filename);
SingleOrDefault
将返回您正在寻找的Spectrum
实例,或者(假设Spectrum
是参考类型)null
如果不存在此类频谱。如果有多个光谱与搜索参数匹配,它也会引发异常。
如果这不是您想要的,请同时查看 Single
和 First
/FirstOrDefault
.
大多数方法还有非 LINQ 替代方法:Array.Find
和几个更静态的Array.FindX
方法。
正如约翰所说,Single
在这里是合适的。如果您有多个频谱对象,可以匹配条件,那么您应该改用频谱对象列表。您还应该比较filename
属性
IEnumerable<Spectrum> tempSpectrums = currentSpectra.Where(c => c.filename == bgSpec.filename);
Spectrum tempSpectrum = currentSpectra.SingleOrDefault(c => c.filename == bgSpec.filename);
还要记住,你不需要为诸如 Where
、Single
、SingleOrDefault
等方法指定泛型类型,编译器将从集合类型推断出 - 类型。
LINQ
中使用Single
或SingleOrDefault
而不是Where
var tempSpectrum = currentSpectra.SingleOrDefault(c => c.filename == bgSpec.filename);