【问题标题】:Sorting Dictionary with child dictionary of object value type [duplicate]使用对象值类型的子字典对字典进行排序[重复]
【发布时间】:2021-01-17 23:28:09
【问题描述】:

我有一个Dictionary<string, Dictionary<string, object>>,需要根据子字典的某个值进行排序。

例如

{
  "James": {
    "Age":  21,
    "Surname": "Doe",
    "Temp": 80.6
  },
  "Tobi": {
    "Age":  26,
    "Surname": "Doe",
    "Temp": 60.5
  }
}

键为 James 和 Tobi 的字典需要根据临时值进行排序。 字符串“Temp”将被赋予该方法以指示要排序的键。

对象值类型会因上下文而异,但该类型对于允许将对象转换为正确类型以进行比较的方法是已知的。

解决方案无法创建特定对象,因为字典 表示对象属性,并且会因方法的每个实现而异。

所有子词典都将具有相同的“属性”,因此没有该值的子词典不会有问题。

简而言之,一个方法接受:

{
  "James": {
    "Age":  21,
    "Surname": "Doe",
    "Temp": 80.6
  },
  "Tobi": {
    "Age":  26,
    "Surname": "Doe",
    "Temp": 60.5
  },
  "Jessica": {
    "Age":  18,
    "Surname": "Samms",
    "Temp": 50.67
  }
}

字符串“温度”

和可能的临时类型

字符串“双”

返回

IEnumerable<KeyValuePair<string,Dictionary<string,object>>>

{
  "Jessica": {
    "Age":  18,
    "Surname": "Samms",
    "Temp": 50.67
  },
  "Tobi": {
    "Age":  26,
    "Surname": "Doe",
    "Temp": 60.5
  },
  "James": {
    "Age":  21,
    "Surname": "Doe",
    "Temp": 80.6
  }
}

【问题讨论】:

  • 你为什么用字典?您是否考虑过将项目转换为实际对象?
  • 我认为这不是Dictionary<string, Dictionary<string, object>>,而是Dictionary<string, T>。看看我的示例:dotnetfiddle.net/J8DgS5
  • 你不能对字典进行排序,它是一个哈希集
  • @jeroenh 拥有实际对象是不可能的。一个实现有年龄和姓氏,另一个实现有位置和温度。用户可以根据需要创建对象,因此它是完全通用的。存储的模型是字符串、对象的字典。
  • @StephanBadenhorst 为什么不为目标类型创建一个具有公共属性的公共基类/接口?

标签: c# linq sorting dictionary object


【解决方案1】:

这很简单,您甚至可能不需要知道类型,因为它会为您解决问题:

// Given "input" is your Dictionary<string,Dictionary<string,object>>
var result = input.OrderBy(kv => kv.Value["Temp"]);

现场示例:https://dotnetfiddle.net/au0vNI

【讨论】:

  • 值得注意的是result不再是字典,不能再像字典一样使用了。现在是可枚举类型。我还冒险猜测,从 Big O 的角度来看,这不是很有效..
  • @Liam 是的 - 我向 cmets 中的 OP 指出了这一点(现已删除),他们更新了他们的问题,期望得到 IEnumerable&lt;KeyValuePair&lt;.....&gt;&gt;,这就是返回的结果。至于 BigO - 这是 O1 来读取上层字典中每个元素的子字典,这将是 O(n)。我没想到还不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2022-01-19
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多