筛选List <object>以获得Dictionary <string,?>并获取第一个键

时间:2019-02-27 17:03:55

标签: c# linq

我有一个IList<object>,其中包含stringDictionary<string, string[]>Dictionary<string, object>的列表。我想获取每个Dictionary的第一个字符串。

我尝试过:

var firstStrings =
    list
    .Where(x => !(x is string))
    .Select(x => ((Dictionary<string, object>)x).Keys.ElementAt(0))
    .ToArray();

但是我得到了错误

  

System.InvalidCastException:无法将类型为'System.Collections.Generic.Dictionary 2[System.String,System.Collections.Generic.List 1 [System.String]]'的对象转换为类型为'System.Collections.Generic.IDictionary`2 [System.String ,System.Object]”。

1 个答案:

答案 0 :(得分:4)

由于错误状态,您无法将Dictionary<string, string[]>强制转换为Dictionary<string, object>。一种执行所需操作的方法是强制转换为IDictionary(并使用OfType而不是Where子句以提高类型安全性:

var firstStrings =
    list.OfType<IDictionary>()
        .Select(x => x.Keys
                      .OfType<object>()
                      .First()
                      .ToString()
               )
        .ToArray();

由于using System.Collections;与通用类位于不同的命名空间,因此您可能需要向您的using块添加IDictionary

另一个注意事项-字典没有顺序,因此“第一个”元素是任意的(添加新的键/值对可能会更改返回的“第一个”键)。