我有一些对象,我想放入一个关联容器,用不可比较的字段值对它们进行分组。如果我有以下内容:
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
函数还是什么?
答案 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字节)。