【问题标题】:LINQ to dictionaryLINQ 到字典
【发布时间】:2018-04-23 16:28:07
【问题描述】:

我可以直接用 LINQ 构建字典吗?

我有以下代码:

    var L = (from C in AppDomain.CurrentDomain.GetAssemblies().AsParallel()
        where !(C.FullName.Contains("System") || C.FullName.Contains("Microsoft") || C.FullName.Contains("mscorlib"))
        from E in C.GetManifestResourceNames().ToList()
        select new KeyValuePair<string, string>(E, C.FullName)).ToDictionary(_ => _.Key, _ => _.Value);

是否可以直接构建字典而不是生成 KeyValuePair 对象然后从它们构建字典?

【问题讨论】:

  • 通常你不需要KeyValuePair 来创建带有 linq 的字典,也许是一个匿名类型来保存键和值。所以是的,这是可能的。
  • 你能给我指出一个语法正确的例子吗?
  • @Dido 和 Camilo,这不是重复的,因为您链接到的问题使用流畅的语法而不是 linq 的解决方案。

标签: c# linq


【解决方案1】:

您可以直接选择需要的数据并对其执行ToDictionary

var L = (from C in AppDomain.CurrentDomain.GetAssemblies().AsParallel()
         where !(C.FullName.Contains("System") || C.FullName.Contains("Microsoft") || C.FullName.Contains("mscorlib"))
         from E in C.GetManifestResourceNames()
         select new { E, C.FullName })
    .ToDictionary(elem => elem.E, elem => elem.FullName);

请注意,如果有重复的 ManifestResourceName,您将获得一个 ArgumentException

【讨论】:

  • 选择新的 { K = E, V = C.FullName}).ToDictionary(_ => _.K, _ => _.V);工作。谢谢
  • @Camilo:感谢您的链接,但是没有 VS 来测试我的代码,我会在前面加上“Try” - 由于我无法验证的数据,代码可能包含错误或模糊 -我的内部编译器不是那么好。
  • @PatrickArtner:如果您不能确定代码是否有效(这是公平的),那么我建议您将文档链接到您正在使用的方法 - 如果它不起作用,那就这样然后人们可以阅读文档以了解它应该如何工作。尽管事实上我建议您链接到文档,即使您已经测试过代码。
【解决方案2】:

如果您使用 C# 7.1 或更高版本 (VS2017.3+),则可以将该键/值对交换为元组:

var L = (from C in AppDomain.CurrentDomain.GetAssemblies().AsParallel()
    where !(C.FullName.Contains("System") || C.FullName.Contains("Microsoft") || C.FullName.Contains("mscorlib"))
    from E in C.GetManifestResourceNames()
    select (E, C.FullName)).ToDictionary(x => x.E, x => x.FullName);

另外,我建议避免使用下划线 (_) 作为标识符名称。从 C# 7 开始,它被用作discard,甚至还有talk of deprecating it as an identifier in future versions of the language

【讨论】:

  • 既然可以选择匿名类型,为什么还要创建元组?
  • @CamiloTerevinto 为什么在可以使用元组的情况下使用匿名类型?
  • +1 表示丢弃。在上述情况下,我有 的代码将其用作临时变量。是时候进行一些重构了...
  • @Thomas 请记住,将其作为标识符弃用的提议是有争议的,并且可能不会发生。但是一旦你开始使用丢弃,下划线作为标识符很快就会变得混乱,所以它可能仍然是一个值得重构的地方。
  • 是的,我阅读了该主题并写道,如果实施了一个好的替代品,我会支持它;其他人提出了@.Data 语法,我想这对我有用
猜你喜欢
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
相关资源
最近更新 更多