在 .Net 3.5 中对哈希集合进行排序

24

如何在c# .Net 3.5中对HashSet<string>进行排序?


4
不行。根据定义,HashSet 不是有序的。你想创建一个有序的副本作为数组吗? - svick
2
原地排序还是返回已排序的副本? - H H
3个回答

36

你不能。按照定义,HashSet不是有序的。

如果你需要一个有序的哈希集合,那么你应该使用SortedSet。它提供的方法本质上是 HashSet 方法的超集,包括对其内容进行排序的能力。


2
请注意,SortedSet不会包含使用HashSet时拥有的不同值,但是在使用适当的扩展方法构建它时,可以加载Distinct值。 - ericosg
2
@ericosg 我不明白你的评论。 - CodesInChaos
1
我的意思是,如果你需要在SortedSet中获取不同的值,你需要调用.Distinct()来获取它们的不同视图。如果你需要一个排序的HashSet,你需要调用.OrderBy()来获取一个排序的视图。 - ericosg
1
一个 HashSet 也没有不同的值。所以我真的不知道你评论的重点是什么。 - Cody Gray
2
真抱歉,这里的关键字是Set,而不是hash。SortedSet也不允许重复项。“SortedSet<T> 在插入和删除元素时保持排序顺序,且性能不受影响。不允许存在重复元素。” - ericosg
6
SortedSet在3.5版本中不可用。 - Karl

17

HashSet<string> 按设计不是排序的。如果您想要对这些项目进行排序一次(不会经常发生),那么您可以使用 OrderBy LINQ 方法(因为 HashSet<string> 实现了 IEnumerable<string>): hs.OrderBy(s => s);

如果您需要排序的哈希集,那么您可以使用 SortedDictionary 类-只需将某个虚拟类型 (例如bool) 用作TValue泛型参数。

SortedSet类在.NET 3.5中不可用。


17
你可以使用 OrderBy 方法,可以使用 IComparer(例如: http://msdn.microsoft.com/en-us/library/bb549422.aspx) 或者将你的比较器与一些 lambda 表达式一起内联使用 (我通常使用谓词进行比较,如下所示)。
参见链接:
        class Pet
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }

        public static void OrderByEx1()
        {
            Pet[] pets = { new Pet { Name="Barley", Age=8 },
                           new Pet { Name="Boots", Age=4 },
                           new Pet { Name="Whiskers", Age=1 } };

            IEnumerable<Pet> query = pets.OrderBy(pet => pet.Age);

            foreach (Pet pet in query)
            {
                Console.WriteLine("{0} - {1}", pet.Name, pet.Age);
            }
        }

        /*
         This code produces the following output:

         Whiskers - 1
         Boots - 4
         Barley - 8
        */

阅读更多:http://msdn.microsoft.com/en-us/library/bb534966.aspx


9
这显然不会对哈希集合本身进行排序,而是返回一个已排序的哈希集合视图。 - CodesInChaos
4
没错,HashSet中包含的值没有排序,但可以以排序视图(或副本)的形式访问。 - ericosg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接