C#如何在此代码中阻止出现此错误消息:Sequence不包含任何元素?

时间:2017-06-06 10:50:53

标签: c# linq dictionary

我有两本词典。一个包含Excel工作表中的列列表和已定义列的列表。我想知道工作表中是否存在已定义的列。如果它们存在,那么它们将在选定的下拉列表中进行选择。

在行 dropdownList.SelectedValue = selectedItem.First()。键; 我有时会得到一个错误消息序列不包含任何元素。我以为我编码了安全性。我忘了什么?

......命令......

SetDataSource(import.ColumnList, import.DefColumnList, ddlSomeColumn, SomeEnum.Zipcode);

...然后是调用方法......

    private void SetDataSource(Dictionary<int, string> columnList, Dictionary<int, string> defColumnList, DropDownList dropdownList, SomeEnum item)
    {
        int index = (int)item;
        dropdownList.BeginUpdate();
        dropdownList.ValueMember = "Key";
        dropdownList.DisplayMember = "Value";
        dropdownList.DataSource = columnList;
        if (defColumnList.ContainsKey(index) && defColumnList[index].Length > 0)
        {
            var selectedItem = columnList.Where(cl => cl.Value == defColumnList[index]);
            if (selectedItem != null)
                dropdownList.SelectedValue = selectedItem.First().Key;
        } 
        dropdownList.EndUpdate();
    }

2 个答案:

答案 0 :(得分:2)

此错误的含义是当您尝试访问不可能的第一个元素时,selectedItem没有元素。

您应该检查集合中是否有任何元素,然后在集合中执行First方法,而不是检查可空性。

var selectedItem = columnList.Where(cl => cl.Value == defColumnList[index]);
if (selectedItem.Any())
    dropdownList.SelectedValue = selectedItem.First().Key;

答案 1 :(得分:1)

.Where()运算符返回枚举,而不是单个元素。因此,您的selectedeItem!= null条件始终返回true。将您的代码更改为:

private void SetDataSource(Dictionary<int, string> columnList, Dictionary<int, string> defColumnList, DropDownList dropdownList, SomeEnum item)
    {
        int index = (int)item;
        dropdownList.BeginUpdate();
        dropdownList.ValueMember = "Key";
        dropdownList.DisplayMember = "Value";
        dropdownList.DataSource = columnList;
        if (defColumnList.ContainsKey(index) && defColumnList[index].Length > 0)
        {
            var selectedItem = columnList.FirstOrDefault(cl => cl.Value == defColumnList[index]);
            if (selectedItem != null)
                dropdownList.SelectedValue = selectedItem.Key;
        } 
        dropdownList.EndUpdate();
    }