【问题标题】:Lambda expression does not work in object listLambda 表达式在对象列表中不起作用
【发布时间】:2016-06-10 11:22:06
【问题描述】:

我有一个对象列表,我可以用那句话添加记录:

List<DragerClass.Alarm> alarms = new List<DragerClass.Alarm>();
public void createAlarm(int i, int[] alarms)
{
    alarms.Add(new DragerClass.Alarm(i, DateTime.Now, DragerClass.Dedector.Dedector_Name[i] + " UNDER RANGE"))`;
}

但是当我尝试删除一个项目时,它的行为就像 lambda 表达式不支持:

public void removeAlarm(int i)
{
    alarms.Remove(x => x.Dedector_No == i);
}

当我站在代码上时,我会看到该消息

无法将 lambda 表达式转换为类型 'Drager_GasDedection.DragerClass.Alarm' 因为它不是委托 输入

我使用的是 Visual Studio 2010,我还在参考资料中添加了System.Data.Entity。但还是一样。感谢您的帮助。

【问题讨论】:

  • @ASh 我现在用 RemoveAll 进行了尝试,现在消息是这样的“'Drager_GasDedection.DragerClass.Alarm' 不包含 'Dedector_No' 的定义,并且没有扩展方法 'Dedector_No' 接受第一个参数可以找到“Drager_GasDedection.DragerClass.Alarm”类型的(您是否缺少使用...)
  • 我觉得你需要alarms.RemoveAt(i);
  • "i" 是项目的数量而不是列表的索引,所以 RemoveAt 没有帮助@MikeDebela
  • @CanESER,我认为您应该解释您要删除的什么(警报或检测器)并描述您的数据结构。但是将Remove 与谓词一起使用是不正确的
  • alarms.RemoveAll(x =&gt; x.Dedector_No == i);

标签: c# list object lambda generic-list


【解决方案1】:

看看methods of List&lt;T&gt;Remove(T) 方法只需要一个元素。如果在列表中找到它,则将其删除,否则不做任何事情。 Remove 不是在寻找它会检查的 Predicate&lt;T&gt;

RemoveAll(Predicate&lt;T&gt;) 但是需要一个谓词。所以你需要打电话:

警报.RemoveAll(x => x.Dedector_No == i);

您还必须在代码中将= 更改为==,否则您将执行赋值而不是相等检查。此外请注意,该方法将删除具有给定探测器编号的所有警报,而不仅仅是第一个。

【讨论】:

  • 在该列表中,每个检测器最多可以有一个警报,因此删除所有警报没有问题,抱歉 '=' 这实际上是我想要输入的,我现在正在修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多