IEnumerable的 使用Linq到DictionaryEntry

问题描述 投票:0回答:1

我正在尝试使用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物体的方法。

c# linq
1个回答
2
投票

这样的事情对你有用吗?

var t = objects
    .Select(e => e.BaseObject)
    .OfType<Hashtable>()
    .SelectMany(e => e.Cast<DictionaryEntry>())
    .ToDictionary(e => (string)e.Key, e => e.Value);

它:

  1. 选择所有BaseObject值。
  2. 查找所有类型Hashtable
  3. 选择所有DictionaryEntry值。
  4. 将它们全部组合成字典。

请注意,如果任何Hashtables中存在重复键,您将获得ArgumentException。但是,这也是您现有解决方案的问题。您可以通过使用.GroupBy(...)并选择第一个项目或以其他方式做出决定来解决这个问题。

如果密钥不是字符串,当您尝试将密钥转换为字符串时,您还将获得InvalidCastException。这也是您当前解决方案的一个问题。你可以在.Where(e => e.Key is string)下面添加一个.SelectMany(...)来过滤掉任何不是字符串键的条目。

© www.soinside.com 2019 - 2024. All rights reserved.