我正在尝试使用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
物体的方法。
这样的事情对你有用吗?
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(...)
来过滤掉任何不是字符串键的条目。