【问题标题】:How to get distinct keys when a Dictionary's key is a string array当字典的键是字符串数组时如何获取不同的键
【发布时间】:2015-04-29 14:57:16
【问题描述】:

我有一个名为 data 的变量定义为:

Dictionary<string[], Dictionary<string, float>> data

如您所见,键是一个字符串数组,值是另一个内部字典。每个键都可以包含以下项目:

{"xxx", "ccc", "wpr", "qpr"}
{"xxx", "abd", "xyz", "qpr"}
{"yyy", "ddd", "kgo", "abc"}

如何使用 LINQ 获取此键的不同第一项?例如,在上面的示例中,我应该得到 xxx 和 yyy 作为结果。其中两个键具有 xxx,一个具有 yyy 作为它们的第一项。

此 Dictionary 的键中的字符串数组用作行标识符。此词典包含的数据是导出到 Excel 的数据。我继承了这个应用程序,所以我不能重新定义这个变量。因此,密钥用于在 Excel 中识别和进行汇总分组。这就是原开发者这样做的原因。

字符串键将始终具有相同的长度。

【问题讨论】:

  • A String[] 作为键,为什么?如果没有自定义 IEqualityComparer(string[]),这是行不通的
  • 数组是否总是相同的长度?如果是,我不会使用数组。
  • 你能解释一下“查找数组组的第一个元素的不同之处”与字典有什么关系吗?我还没有看到这种联系,因此担心问题的质量。
  • 旁注:如果你碰巧使用这样的字典,请确保有适当的自定义比较器,类似于stackoverflow.com/questions/14663168/…中的比较器
  • 虽然您将我的答案标记为正确,但您应该阅读并理解其他答案。使用字符串数组作为键可能是一个非常糟糕的主意。默认情况下,它不使用数组的值作为键,而是使用引用,这对于不熟悉它的工作原理的人来说是反直觉的,而且很容易做出各种错误的假设。

标签: c# linq


【解决方案1】:

类似...

var result=data.Keys.Select(k=>k[0]).Distinct();

【讨论】:

  • 太好了,这对我有用。学习了一些关于 LINQ 如何与字典配合使用的新知识。谢谢!
【解决方案2】:

使用String[] 作为字典中的键无法按预期工作,因为该类型不会覆盖Equals + GetHashCode。如果您不想只比较引用,则需要为字典构造函数自定义 IEqualityComparer(string[])

除此之外,试试这个:

IEnumerable<string> firstColumnDistinct = data.Keys
   .Select(arr => arr.FirstOrDefault())
   .Distinct();

FirstOrDefault 也处理数组为空的情况。

【讨论】:

  • 正确。假设 string[] 键总是具有相同的长度,可以实现你简单提到的 curstom IEqualityComparer&lt;string[]&gt;class MyStringArrayEqualComp : EqualityComparer&lt;string[]&gt; { public override bool Equals(string[] x, string[] y) { return System.Collections.StructuralComparisons.StructuralEqualityComparer.Equals(x, y); } public override int GetHashCode(string[] obj) { return System.Collections.StructuralComparisons.StructuralEqualityComparer.GetHashCode(obj); } }
  • 请注意,空数组将与第 0 个条目是 null 引用的非空数组在同一个“组”中。
  • @JeppeStigNielsen:感谢提及StructuralEqualityComparer。是的,它是一样的,取决于是首选还是 k[0] 的例外情况,如已接受。
猜你喜欢
  • 2014-03-22
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多