首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#、SortedSet<T>和相等

C#、SortedSet<T>和相等
EN

Stack Overflow用户
提问于 2011-12-22 20:53:59
回答 3查看 10.6K关注 0票数 13

我对SortedSet的行为有点迷惑,请看下面的例子:

代码语言:javascript
复制
public class Blah
{
    public double Value { get; private set; }

    public Blah(double value)
    {
        Value = value;
    }
}

public class BlahComparer : Comparer<Blah>
{
    public override int Compare(Blah x, Blah y)
    {
        return Comparer<double>.Default.Compare(x.Value, y.Value);
    }
}

public static void main()
{
    var blahs = new List<Blah> {new Blah(1), new Blah(2), 
                                new Blah(3), new Blah(2)}

    //contains all 4 entries
    var set = new HashSet<Blah>(blahs); 

    //contains only Blah(1), Blah(2), Blah(3)
    var sortedset = new SortedSet<Blah>(blahs, new BlahComparer());
}

因此,如果SortedSet (x,y)返回0,则比较将丢弃条目。我是否可以防止这种情况,使我的SortedSet行为类似于HashSet,并且仅当Equals()返回true时才丢弃条目?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-22 21:35:45

如果在两个值相等时提供备用比较,并且Compare方法否则将返回0,则可以执行此操作。在大多数情况下,这可能只会推迟问题,而不是解决它。正如其他人所指出的,SortedSet丢弃重复项,当您提供自定义比较器时,它会使用该比较器来确定重复项。

代码语言:javascript
复制
    static void Main(string[] args)
    {
        var blahs = new List<Blah>
                        {
                            new Blah(1, 0), new Blah(2, 1),
                            new Blah(3, 2), new Blah(2, 3)
                        };

        blahs.Add(blahs[0]);

        //contains all 4 entries
        var set = new HashSet<Blah>(blahs);

        //contains all 4 entries
        var sortedset = new SortedSet<Blah>(blahs, new BlahComparer());

    }
}

public class Blah
{
    public double Value { get; private set; }

    public Blah(double value, int index)
    {
        Value = value;
        Index = index;
    }

    public int Index { get; private set; }

    public override string ToString()
    {
        return Value.ToString();
    }
}

public class BlahComparer : Comparer<Blah>
{
    public override int Compare(Blah x, Blah y)
    {
        // needs null checks
        var referenceEquals = ReferenceEquals(x, y);
        if (referenceEquals)
        {
            return 0;
        }
        var compare = Comparer<double>.Default.Compare(x.Value, y.Value);
        if (compare == 0)
        {
            compare = Comparer<int>.Default.Compare(x.Index, y.Index);
        }
        return compare;
    }
}
票数 5
EN

Stack Overflow用户

发布于 2011-12-22 20:58:36

描述

SortedSet:您有许多需要存储的元素,并且您希望以排序的顺序存储它们,并且从数据结构中消除所有重复的。SortedSet类型提供了此功能,它是C#语言和.NET框架中System.Collections.Generic命名空间的一部分。

根据MSDN Compare方法返回

如果x小于零,则大于零;如果x等于y.

  • Greater,则大于;如果x大于y,则大于。

更多信息

  • Dotnetperls - C# SortedSet Examples
  • MSDN: Compare Method

更新

如果您的Bla类实现了IComparable,并且您希望对列表进行排序,则可以这样做。

代码语言:javascript
复制
var blahs = new List<Blah> {new Blah(1), new Blah(2), 
                            new Blah(3), new Blah(2)};
blahs.Sort();

如果您的Bla而不是实现了IComparable,并且您希望对列表进行排序,则可以使用Linq (System.Linq命名空间)。

代码语言:javascript
复制
blahs = blahs.OrderBy(x => x.MyProperty).ToList();
票数 9
EN

Stack Overflow用户

发布于 2011-12-22 21:04:28

您无法找到另一个Blah(2),因为您正在使用Set

代码语言:javascript
复制
Set - A collection of well defined and **distinct** objects

例如,MultiSet允许重复对象。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8604149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档