我有一个IList<object>
,其中包含string
,Dictionary<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]”。
答案 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
。
另一个注意事项-字典没有顺序,因此“第一个”元素是任意的(添加新的键/值对可能会更改返回的“第一个”键)。