【问题标题】:Sequence contains no matching element, FirstOrDefault序列不包含匹配元素,FirstOrDefault
【发布时间】:2012-02-03 00:59:19
【问题描述】:
public ActionResult Update(string id)
{
    Device record = new Device(); // OK
    record = record.Find(new Guid(id), service); // OK

    if (record.secondValue.HasValue) // <--- 
          record.secondSelectList.FirstOrDefault(i => i.Value == record.secondValue.ToString()).Selected = true;
    return View(record);
 }

上面的代码找到给定ID的设备,然后设置DropDownList 如果 secondValue有值,如果没有则跳过。

代码完美运行,但在许多控制器的许多操作中,我必须设置 IF 条件来检查 xxxValue 是否确实有值。

我不能直接这样做:

record.secondSelectList.FirstOrDefault(i => i.Value == record.secondValue.ToString()).Selected = true;

因为在任何时候 FirstOrDefault 都可能返回一个空引用,这会因为使用 .Selected 属性而立即引发异常。

好的,我的问题是如何设置DropDownList而不需要使用If条件?

我想我不会使用 FirstOrDefault(),而是使用 SetSelected()。

record.secondSelectList.SetSelected(i => i.Value == record.secondValue.ToString());

SetSelected() 方法在哪里,我将处理 null 结果。 我该怎么做?

【问题讨论】:

  • 这个问题可能看起来很傻,但我不知道该搜索哪个主题?

标签: c# linq


【解决方案1】:

你可以内联:

record.secondSelectList.FirstOrDefault(i => { if (i.Value == record.secondValue.ToString()) { i.Selected = true; return true; } return false; });

或者,可能更清楚:

foreach (var listItem in record.secondSelectList) {
    if (listItem.Value == record.secondValue.ToString()) 
        listItem.Selected = true;
}

【讨论】:

  • +1 LINQ 用于查询,而非编辑。由于 OP 正在更改数据,因此 foreach + if 在这里更合适。
  • 第一个选项给出编译错误:并非所有代码路径都在 'System.Func' 类型的 lambda 表达式中返回值。对于第二个选项,我在我的问题中看到了与上面的原始代码不同的更多语句。我的意思是如果解决方案是使用 foreach,那么我会更好地坚持 If 条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
相关资源
最近更新 更多