我有一个 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() http://msdn.microsoft.com/en-us/library/system.linq.enumerable.first.aspx如果找不到任何匹配的元素,则会抛出异常。鉴于您之后立即测试 null,听起来您想要FirstOrDefault() http://msdn.microsoft.com/en-us/library/bb340482.aspx,如果未找到匹配项,则返回元素类型的默认值(对于引用类型为 null):
var documentRow = _dsACL.Documents.FirstOrDefault(o => o.ID == id)
在某些情况下需要考虑的其他选项是Single() http://msdn.microsoft.com/en-us/library/system.linq.enumerable.single.aspx(当你相信只有一个匹配元素时)并且SingleOrDefault() http://msdn.microsoft.com/en-us/library/system.linq.enumerable.singleordefault.aspx(当您相信只有一个或零个匹配元素时)。我怀疑FirstOrDefault
在这种特殊情况下是最好的选择,但无论如何还是值得了解其他选择。
另一方面,看起来您首先在此处加入实际上可能会更好。如果你不关心它会做all您可以使用的匹配项(而不仅仅是第一个):
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
}
这样更简单and海事组织更高效。
即使你do决定保留循环,我有几个建议:
- 摆脱外在的束缚
if
。你不需要它,就好像 Count 为零一样 for 循环体永远不会执行
-
在 for 循环中使用独占上限 - 它们在 C# 中更为惯用:
for (i = 0; i < _lstAcl.Documents.Count; i++)
-
消除公共子表达式:
var target = _lstAcl.Documents[i];
// Now use target for the rest of the loop body
-
尽可能使用foreach
代替for
首先:
foreach (var target in _lstAcl.Documents)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)