c# - 序列不包含匹配元素

标签 c# linq exception

我有一个 asp.net 应用程序,我在其中使用 linq 进行数据操作。运行时,出现异常“序列不包含匹配元素”。

if (_lstAcl.Documents.Count > 0)
{
    for (i = 0; i <= _lstAcl.Documents.Count - 1; i++)
    {
        string id = _lstAcl.Documents[i].ID.ToString();                           
        var documentRow = _dsACL.Documents.First(o => o.ID == id);
        if (documentRow !=null)
        {

            _lstAcl.Documents[i].Read = documentRow.Read;
            _lstAcl.Documents[i].ReadRule = documentRow.ReadRule;

            _lstAcl.Documents[i].Create= documentRow.Create;
            _lstAcl.Documents[i].CreateRule = documentRow.CreateRule;

            _lstAcl.Documents[i].Update = documentRow.Update;
            _lstAcl.Documents[i].UpdateRule = documentRow.UpdateRule;

            _lstAcl.Documents[i].Delete = documentRow.Delete;
            _lstAcl.Documents[i].DeleteRule = documentRow.DeleteRule;
        }
    }
}

最佳答案

好吧,我希望是这一行抛出异常:

var documentRow = _dsACL.Documents.First(o => o.ID == id)

First()如果找不到任何匹配的元素,将抛出异常。鉴于您之后立即测试空值,听起来您想要 FirstOrDefault() , 如果没有找到匹配项,它返回元素类型的默认值(对于引用类型为 null):

var documentRow = _dsACL.Documents.FirstOrDefault(o => o.ID == id)

在某些情况下要考虑的其他选项是 Single() (当您认为只有一个匹配元素时)和 SingleOrDefault() (当您认为只有一个或零个匹配元素时)。我怀疑 FirstOrDefault 是这种特殊情况下的最佳选择,但无论如何都值得了解其他选项。

另一方面,看起来您首先加入这里可能会更好。如果您不关心它是否会进行所有 匹配(而不仅仅是第一个),您可以使用:

var query = from target in _lstAcl.Documents
            join source in _dsAcl.Document
            where source.ID.ToString() equals target.ID
            select new { source, target };
foreach (var pair in query)
{
    target.Read = source.Read;
    target.ReadRule = source.ReadRule;
    // etc
}

IMO 更简单更有效率。

即使您确实决定保留循环,我也有一些建议:

  • 去掉外层的 if。你不需要它,就好像 Count 为零一样 for 循环体永远不会执行
  • 在 for 循环中使用独占上限 - 它们在 C# 中更为惯用:

    for (i = 0; i < _lstAcl.Documents.Count; i++)
    
  • 消除公共(public)子表达式:

    var target = _lstAcl.Documents[i];
    // Now use target for the rest of the loop body
    
  • 尽可能使用 foreach 而不是 for 开始:

    foreach (var target in _lstAcl.Documents)
    

关于c# - 序列不包含匹配元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3994336/

相关文章:

javascript - 单击链接可放大图像

c# - Linq:创建表达式的逻辑逆

linq - 什么是 LINQ to events a.k.a RX Framework?

c - C(不是 C++)的异常库

java - 你如何记录未经检查的异常?

c# - asp中继器按钮文本更改

c# - 创建线程 - Task.Factory.StartNew 与 new Thread()

c# - 如何使用列表查询查找表?

c# - LINQ OrderBy 有一个异常(exception)

java - 使用 jaxb 时出现编码(marshal)异常