是否有类似SortedSet的容器​​,可以对不可比较的对象进行分组?

时间:2017-11-20 06:37:34

标签: c# sortedset icomparable

我有一些对象,我想放入一个关联容器,用不可比较的字段值对它们进行分组。如果我有以下内容:

using System.Collections.Generic;
using Pair = System.Tuple<Penguin, int>;

class Penguin {}

class Whatever {

    public static void Main(string[] args) {
        Penguin emperor = new Penguin(),
                adelie = new Penguin(),
                batmanVillain = new Penguin();

        var okay = new HypotheticalCollection<Pair>(5);

        okay.Add(new Pair(emperor, 1) );
        okay.Add(new Pair(adelie, 2) );
        okay.Add(new Pair(batmanVillain, 3) );
        okay.Add(new Pair(emperor, -500) );
        okay.Add(new Pair(batmanVillain, 5) );

    }
}

我迭代了HypotheticalCollection,我希望看到两个emperor条目和两个batmanVillain条目在一起,但我不在乎哪一个是第一个。但是,我希望能够以对数时间查找条目。

如果我使用的是C ++,我只会根据他们的地址对Penguin进行排序,但我在C#中没有那么奢侈。现在我正在通过为每个对象分配一个序列号来处理它,但这有点像hacky,我宁愿不要有额外的空间开销。有没有更好的方法,可能是ReferenceLessThan函数还是什么?

1 个答案:

答案 0 :(得分:1)

选项1 :(建议)

public static class Whatever
{
    class Penguin
    {
        private Guid id = Guid.NewGuid();       
        public Guid GetId() { return id; }
    }

    public static void Main(string[] args)
    {
        Penguin emperor = new Penguin(),
            adelie = new Penguin(),
            batmanVillain = new Penguin();

        var okay = new List<KeyValuePair<Penguin, int>>();
        okay.Add(new KeyValuePair<Penguin, int>(emperor, 1));
        okay.Add(new KeyValuePair<Penguin, int>(adelie, 2));
        okay.Add(new KeyValuePair<Penguin, int>(batmanVillain, 3));
        okay.Add(new KeyValuePair<Penguin, int>(emperor, -500));
        okay.Add(new KeyValuePair<Penguin, int>(batmanVillain, 5));

        okay.Sort((a, b) => a.Key.GetId().CompareTo(b.Key.GetId()));

        // Iterate 'okay'
    }
}

选项2是在排序比较函数中使用对象地址,根据this,它不是修复地址,可以由CLR更改。此外,获取地址需要使用unsafe标记构建您的应用。如果你声称选项1感觉“hacky”,那么csharaply选项2是超级“hacky”。而GUID是128位整数(16字节)。