我对SortedSet的行为有点迷惑,请看下面的例子:
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时才丢弃条目?
发布于 2011-12-22 21:35:45
如果在两个值相等时提供备用比较,并且Compare方法否则将返回0,则可以执行此操作。在大多数情况下,这可能只会推迟问题,而不是解决它。正如其他人所指出的,SortedSet丢弃重复项,当您提供自定义比较器时,它会使用该比较器来确定重复项。
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;
}
}发布于 2011-12-22 20:58:36
描述
SortedSet:您有许多需要存储的元素,并且您希望以排序的顺序存储它们,并且从数据结构中消除所有重复的。SortedSet类型提供了此功能,它是C#语言和.NET框架中System.Collections.Generic命名空间的一部分。
根据MSDN Compare方法返回
如果x小于零,则大于零;如果x等于y.
更多信息
更新
如果您的Bla类实现了IComparable,并且您希望对列表进行排序,则可以这样做。
var blahs = new List<Blah> {new Blah(1), new Blah(2),
new Blah(3), new Blah(2)};
blahs.Sort();如果您的Bla类而不是实现了IComparable,并且您希望对列表进行排序,则可以使用Linq (System.Linq命名空间)。
blahs = blahs.OrderBy(x => x.MyProperty).ToList();发布于 2011-12-22 21:04:28
您无法找到另一个Blah(2),因为您正在使用Set。
Set - A collection of well defined and **distinct** objects例如,MultiSet允许重复对象。
https://stackoverflow.com/questions/8604149
复制相似问题