我编写C#和LINQ查询已经很长时间了。我想浏览一个临时列表,在1个字段(名为Model(上查找匹配的值。规范规定,如果有一个匹配的模型,那么它就不会被添加到列表中。所以,我删除了重复的模型,只在列表中放入唯一的模型,然后返回。以下是我为此编写的函数:
private List<InstrumentModel> EnsureInstrumentModelListUnique(List<InstrumentModel> instrumentModels)
{
var tmpList = new List<InstrumentModel>();
if (instrumentModels == null || instrumentModels.Count <= 1)
{
//nothing to see here folks, move on
return instrumentModels;
}
for (int i = 0; i < instrumentModels.Count; i++)
{
if (i == 0)
{
tmpList.Add(instrumentModels[0]);
}
else
{
//get current model
string model = instrumentModels[i].Model;
//check to see if model is somewhere in the list
var rec = tmpList.Where(t => t.Model == model).FirstOrDefault();
//if it isn't there, put it in
if (rec == null)
{
tmpList.Add(rec);
}
}
}
return tmpList;
}
在崩溃之前,它与for
循环进行了3次。它在tmpList.Where(t => t.Model == model).FirstOrDefault()
中的t.Model
上崩溃,声称t
为null。
我不明白t
在循环的第三次迭代中是如何为空的。instrumentModels
来自的表中有5条记录。所有记录都在Model列中。
以下是InstrumentModel的定义,为了简洁起见,只包含了相关列:
[Table("app.InstrumentModel")]
[DebuggerDisplay("ID == {ID}, Model == {Model}, Inactive == {Inactive}")]
public partial class InstrumentModel
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public InstrumentModel()
{
Instruments = new HashSet<Instrument>();
PersonnelCertifications = new HashSet<PersonnelCertification>();
}
[Key]
public long ID { get; set; }
[Required]
[StringLength(30)]
public string Model { get; set; }
}
我正在使用WPF,.NET Framework 4.5.2,VS 2019
正如@madreflection所指出的,问题就在这里:
//check to see if model is somewhere in the list
var rec = tmpList.Where(t => t.Model == model).FirstOrDefault();
//if it isn't there, put it in
if (rec == null)
{
tmpList.Add(rec);
}
在这种情况下,您插入的是rec
,而我认为您应该插入model
。
使用Any
,代码更简单。如果你这样做,就没有空变量可以混淆。
bool found = tmpList.Any(t => t.Model == model);
if (!found)
{
tmpList.Add(model);
}