I am a bit puzzled about the behaviour of SortedSet, see following example:
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());
}
So SortedSet discards entries if Compare(x,y) returns 0. Can I prevent this, such that my SortedSet behaves like HashSet and discards entries only if Equals() returns true?
In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.
What is C? C is a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.
C is a general-purpose language that most programmers learn before moving on to more complex languages. From Unix and Windows to Tic Tac Toe and Photoshop, several of the most commonly used applications today have been built on C. It is easy to learn because: A simple syntax with only 32 keywords.
C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...
SortedSet: You have many elements you need to store, and you want to store them in a sorted order and also eliminate all duplicates from the data structure. The SortedSet type, which is part of the System.Collections.Generic namespace in the C# language and .NET Framework, provides this functionality.
According to MSDN Compare
method returns
If your Bla
class implements IComparable
and you want your list sorted you can do this.
var blahs = new List<Blah> {new Blah(1), new Blah(2),
new Blah(3), new Blah(2)};
blahs.Sort();
If your Bla
class NOT implements IComparable
and you want your list sorted you can use Linq
(System.Linq namespace) for that.
blahs = blahs.OrderBy(x => x.MyProperty).ToList();
You can do this if you provide an alternate comparison when the Values are equal and the Compare method would otherwise return 0. In most cases this would probably just defer the problem instead of solving it. As others have noted, the SortedSet discards duplicates and when you provide a custom comparer it uses that to determine duplicity.
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;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With