【问题标题】:How to sort a hashtable of class values by their property in c#?如何在 c# 中按类值的属性对类值的哈希表进行排序?
【发布时间】:2016-10-26 03:06:08
【问题描述】:

我在 C# 中有一个哈希表。

Hashtable people = new Hashtable();
people.Add(0, new Person("Jimmi", "Hendrix"));
people.Add(1, new Person("Bob", "Dylan"));
people.Add(2, new Person("Jim", "Morrison"));

我如何使用 Linq 按人的姓氏对这个哈希进行排序?

class Person
{
    public Person(string firstName, string lastName): this(firstName, lastName, DateTime.Now)
    {}

    public Person(string firstName, string lastName, DateTime birthDate)
    {
        FirstName = firstName;
        LastName = lastName;
        DateOfBirth = birthDate;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

【问题讨论】:

  • 所有基于 has-table 的类型(Dictionary、HashSet、Hashtable)都没有排序的概念。如果您阐明了您真正想要实现的目标,那么有人可能会建议更合适的类型或方法来实现这一目标。
  • 请注意,对于在受支持的 .Net 框架(而不是 1.x)上运行的代码,使用 Dictionary<int, Person> 会是更好的选择..

标签: c# linq hashtable


【解决方案1】:
var result = people.Cast<DictionaryEntry>().OrderBy(kvp => ((Person)kvp.Value).LastName);

结果变成了OrderedEnumerable,因为放回Hashtable会忘记顺序。\

编辑: 如果您正在寻找一种方法来枚举结果并提取 id 以及 Person 信息,您可以这样做:

// this is the original answer
var result = people.Cast<DictionaryEntry>().OrderBy(kvp => ((Person)kvp.Value).LastName);

// now convert it to an array
var listToIterate = result.ToArray();
foreach(var item in listToIterate)
{
    var id = item.Key;
    var person = (Person)item.Value;
}

希望这会有所帮助...!

【讨论】:

  • 抱歉,从未使用过 OrderedEnumerables 我将如何迭代这个?
  • 您可以将其转换为带有ToArray() 的数组或以ToList() 结尾的列表。迭代......foreach(var item in result)
  • @nebulus:简单——只需调用IOrderedEnumerableToList() 方法并将结果分配给一个变量。然后你可以像普通列表一样枚举它。
  • 啊。让我用您正在寻找的完整解决方案编辑@kurakura88 的答案。
  • 不错!它有效,最后一件事当名称有数字时我将如何对其进行排序,顺序不应该是 1、10、2 而是 1、2... 10。干杯!
【解决方案2】:

您正在使用非通用(IMO 旧版)数据类型。所以你需要戳一下它才能得到你想要的。

people.Values.OfType&lt;Person&gt;().OrderBy(p =&gt; p.LastName);

首先您要对值进行排序,但这不是通用的,因此请使用OfType。现在您可以使用标准的 Linq 运算符,例如 OrderBy

【讨论】:

  • 好的,谢谢...我如何迭代它并仍然获得密钥对?
  • 按照 Alexei 的建议,不要使用 hashtable。这是一个过时的类型。使用字典
  • 好吧,我还是不知道怎么用。我需要将其输出为数组并查看 ID。
  • @LeeCampbell:我不会说“不要使用 HashTable,因为它是过时的类型”。这基本上是在做出一个巨大的假设,即您假设的问题域以全局方式与所有问题域正交。 OP 可能受到特定的约束和 TBH,它一个有趣的问题,从 HashTable 中提取排序列表。这正是我们在维护遗留代码时可能面临的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
相关资源
最近更新 更多