究竟如何使用array.where?

时间:2012-05-25 10:53:01

标签: c# .net arrays

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

mySpectrum.filename; //字符串

现在我有一个stringvalue,我想与数组中的每个对象进行比较,以找出它是否具有相同的文件名。我得到它应该这样工作:

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 个答案:

答案 0 :(得分:7)

看起来您正在寻找满足该标准的值。所以也许可以使用Single

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

其他选择:

如果没有匹配的元素,OrDefault版本将返回nullFirstSingleLast之间的区别在于多个匹配的结果:Single将引发异常,而First或{{1将分别进行第一场或最后一场比赛。

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

答案 1 :(得分:3)

Where将输入序列缩小为子集。这不完全是你想要的,这可能更像是

var tempSpectrum = currentSpectra
                   .SingleOrDefault(c => c.filename == bgSpec.Filename);
如果不存在此类频谱,

SingleOrDefault将返回您正在查找的Spectrum实例或(假设Spectrum是引用类型)null。如果有多个光谱与搜索参数匹配,它也会抛出异常。

如果这不是您想要的,请同时查看SingleFirst / FirstOrDefault

其中大多数还有非LINQ替代方案:Array.Find和更多静态Array.FindX方法。

答案 2 :(得分:2)

正如约翰所说,Single在这里是合适的。如果你有几个可以匹配条件的光谱对象,那么你应该使用光谱对象列表。您还应该比较filename属性

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

另请注意,您不需要为WhereSingleSingleOrDefault这样的方法指定泛型类型 - 编译器将从集合类型推断出类型。

答案 3 :(得分:1)

Single代替SingleOrDefault

使用LINQWhere
var tempSpectrum = currentSpectra.SingleOrDefault(c => c.filename == bgSpec.filename);