IEnumerable <hashtable>使用Linq

时间:2018-03-01 00:47:56

标签: c# linq

我尝试使用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个对象的方法。

1 个答案:

答案 0 :(得分: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. 将它们全部合并到字典中。
  5. 请注意,如果任何Hashtables中存在重复键,您将获得ArgumentException。但是,这也是您现有解决方案的问题。您可以使用.GroupBy(...)并选择第一项,或以其他方式做出决定来解决这个问题。

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