C# 基于特定属性维护排序顺序的集合类?

C# 基于特定属性维护排序顺序的集合类?,c#,data-structures,C#,Data Structures,我正在寻找一个集合类,它将根据属性(即“优先级”)自动按排序顺序插入元素,这样当我稍后迭代它时,我将按此顺序返回元素 似乎按键排序,这不是我想要的。您需要一个。在这个类似的问题中,您可以找到几个实现:。您可以使用.NET 4新增的SortedSet。您可以在实现IComparable的类上使用它,也可以通过构造函数重载提供外部比较器。例如: class Foo { public int Bar { get; set; } } class FooComparer : IComparer

我正在寻找一个集合类,它将根据属性(即“优先级”)自动按排序顺序插入元素,这样当我稍后迭代它时,我将按此顺序返回元素



似乎按键排序,这不是我想要的。

您需要一个。在这个类似的问题中,您可以找到几个实现:。

您可以使用.NET 4新增的
SortedSet
。您可以在实现
IComparable
的类上使用它,也可以通过构造函数重载提供外部比较器。例如:

class Foo
{
    public int Bar { get; set; }
}

class FooComparer : IComparer<Foo>
{
    public int Compare(Foo x, Foo y)
    {
        // add null checking, demo purposes only
        return x.Bar.CompareTo(y.Bar);
    }
}
class-Foo
{
公共整型条{get;set;}
}
类FooComparer:IComparer
{
公共整数比较(Foo x,Foo y)
{
//添加空检查,仅用于演示目的
将x.Bar.比较器返回到(y.Bar);
}
}

SortedSet-sortedFoos=新的SortedSet(新的食品比较器());
Add(newfoo(){Bar=2});
Add(newfoo(){Bar=1});
foreach(分类食品中的食品)
{
控制台写入线(foo.Bar);
}
//打印1,2

注意:此集合的行为类似于
HashSet
。如果添加多个比较相等的对象,它们将被丢弃

这正是我想要的。

你试过SortedDictionary吗@哈维:也按键排序。我不想要钥匙。这句话“SortedList似乎是按钥匙排序的,这不是我想要的。”你的问题是矛盾的。为了强制执行任何种类的排序顺序,必须有一个比较函数(因此需要比较一个键)!也许你想要一个FIFO队列?@Mitch:我想我们在这里混淆了术语。通过“键”,我指的是放在方括号中检索项目的东西;索引器。我不想要那种,那基本上是一本字典。听起来你指的是排序键。。。是的,其中一个属性将作为排序依据的“键”,但您将无法检索具有此值的项。如果有用的话,我正在寻找一个按
值排序的
列表
。我知道你已经得到了答案,但从你提供的有限信息来看,似乎你需要C5中的
树状图
,或者Power Collections中的
OrderedBag
。传递一个合适的比较器就可以了。看,这似乎是我想要的。如果我在数据类型上实现
IComparable
,我假设它会使用它?同时,我假设排序是“稳定的”?--如果插入两个比较相等的元素,则第一个元素仍将是集合中的第一个元素?@Ralph,是的,它将支持
IComparable
。有关更多信息,我将从MSDN文档开始@拉尔夫,小心!这看起来像是一个
哈希集
,如果两项比较相等,则第二项将被丢弃。如果您需要具有相同键属性的多个项目,您可能需要考虑另一个结构。@安东尼:是的…“key”属性将被重复,但对象作为一个整体应该是唯一的。我想如果只看比较函数也没关系。呵呵……还有我的问题:)不同的是,这次我不需要区分优先级。
SortedSet<Foo> sortedFoos = new SortedSet<Foo>(new FooComparer());
sortedFoos.Add(new Foo() { Bar = 2 });
sortedFoos.Add(new Foo() { Bar = 1 });

foreach (Foo foo in sortedFoos)
{
    Console.WriteLine(foo.Bar);
}
// Prints 1, 2