我尝试使用Linq从DictionaryEntry
获取所有IEnumerable<Hashtable>
个对象,但是对于我的生活,我们无法弄清楚如何做到这一点。
我的意思是对我来说最明显的事情就是使用.SelectMany(x => x).Cast<DictionaryEntry>()
来试图压扁它,但这不起作用!
任何人都有任何想法如何使用Linq单独完成这项工作?
修改
我已经获得了以下代码,尝试将其转换为Linq:
var t = new Dictionary<string, object>();
foreach (PSObject obje in objects)
{
foreach (DictionaryEntry entry in (Hashtable) obje.BaseObject)
{
t.Add((string) entry.Key, entry.Value);
}
}
return t;
我试图将其转换为Linq:
objects.Cast<PSObject>().Select(x => (Hashtable) x.BaseObject)
,它留给我一个IEnumerable<Hashtable>
,但就像我说的那样,无法找到从那里获取DictionaryEntry
个对象的方法。
答案 0 :(得分:2)
这样的事情对你有用吗?
var t = objects
.Select(e => e.BaseObject)
.OfType<Hashtable>()
.SelectMany(e => e.Cast<DictionaryEntry>())
.ToDictionary(e => (string)e.Key, e => e.Value);
有:
请注意,如果任何Hashtables中存在重复键,您将获得ArgumentException
。但是,这也是您现有解决方案的问题。您可以使用.GroupBy(...)
并选择第一项,或以其他方式做出决定来解决这个问题。
如果密钥不是字符串,当您尝试将密钥转换为字符串时,也会得到InvalidCastException
。这也是您当前解决方案的一个问题。您可以在.Where(e => e.Key is string)
下方添加.SelectMany(...)
,以过滤掉任何非字符串键的条目。