序列不包含linq的元素错误

时间:2014-02-02 08:27:58

标签: asp.net .net linq c#-3.0 dropdownlistfor

我正在使用LINQ代码来查找DropDownList选择值

string txtnewrole = ddlRoleList.Items.FindByText("Admin").ToString();     
ListItem item = (from i in ddlRoleList.Items.Cast<ListItem>() 
                 where ((ListItem)i).Value.Contains(txtnewrole)select i).First()as ListItem;
string roleid = ddlRoleList.Items.FindByValue(item.Value).ToString();

Linq声明给我错误,序列中没有元素,plz帮我纠正这个 ,我尝试了第一个默认它返回我null,但在我的DropDownList我有管理文本值为2,我写这个linq得到admin的值,项值为null。怎么做到这一点?

2 个答案:

答案 0 :(得分:4)

使用FirstOrDefault()代替First()然后检查该项是否为空。如果sequence不包含元素,则First()抛出异常,但FirstOrDefault()在这种情况下返回null。

另请注意此代码

string txtnewrole = ddlRoleList.Items.FindByText("Admin").ToString(); 

返回类似System.Web.UI.WebControls.ListItem的内容我不确定它是否正是您想要的。除非您使用扩展方法覆盖ToString()

答案 1 :(得分:2)

我想在 @Daniel 回答中添加更多积分。

  1. 使用ddlRoleList.Items.FindByText("Admin").ToString()时,可能会出现NULL异常。如果ddlRoleList.Items.FindByText("Admin")找不到,则返回“NULL”

  2. 我没有看到ddlRoleList.Items.FindByValue(item.Value).ToString();的正确用法。在这里,您尝试再次按值查找并转换为字符串。由于您已找到item中的Linq

  3. 您需要做的是item.Text

  4. 如果您有更好的理解,我会以适当的方式为您编写以下代码:

    String txtNewRole = String.Empty;
    String roleId = String.Empty;
    
    ListItem adminListItem = ddlRoleList.Items.FindByText("Admin");
    if (adminListItem != null)
        txtNewRole = adminListItem.Text;
    
    //ListItem item = ddlRoleList.Items.Cast<ListItem>().Where(i => i.Value.Contains(txtNewRole)).Select(i => i).FirstOrDefault();
    
    //OR
    
    ListItem item = ddlRoleList.Items.Cast<ListItem>().FirstOrDefault(i => i.Value.Contains(txtNewRole));
    
    if (item != null)
        roleId = item.Text;
    
相关问题