Implementazione di icomparer personalizzato con stringa
Domanda
Ho una raccolta di stringhe in C#, per esempio;
var example = new string[]{"c", "b", "a", "d"};
Poi per ordinare questo, ma il mio metodo ICOMparer non funziona e mi vando infinitamente dalle cose.
Fondamentalmente ho bisogno "b"
per venire prima, seguito da "c"
, Quindi non mi interessa l'ordine di nessuno degli altri.
È possibile usando iComparer<string>
e il Compare(string x, string y)
metodo?
Modifica: codice
public int Compare(string x, string y)
{
var sOrder = new string[] { "b", "c" };
int index_x = -1;
int index_y = -1;
for (int i = 0; i < sOrder.Length;i++)
{
if (sOrder[i] == x)
index_x = i;
else if (sOrder[i] == y)
index_y = i;
}
if (index_x >= 0 && index_y >= 0)
{
if (index_x < index_y)
{
return -1;
}
else
return 1;
}
return 0;
}
Soluzione
Questo dovrebbe fare quello che vuoi:
var example = new string[]{"c", "a", "d", "b"};
var comparer = new CustomStringComparer(StringComparer.CurrentCulture);
Array.Sort(example, comparer);
...
class CustomStringComparer : IComparer<string>
{
private readonly IComparer<string> _baseComparer;
public CustomStringComparer(IComparer<string> baseComparer)
{
_baseComparer = baseComparer;
}
public int Compare(string x, string y)
{
if (_baseComparer.Compare(x, y) == 0)
return 0;
// "b" comes before everything else
if (_baseComparer.Compare(x, "b") == 0)
return -1;
if (_baseComparer.Compare(y, "b") == 0)
return 1;
// "c" comes next
if (_baseComparer.Compare(x, "c") == 0)
return -1;
if (_baseComparer.Compare(y, "c") == 0)
return 1;
return _baseComparer.Compare(x, y);
}
}
Altri suggerimenti
Un modo semplice è sostituire i numeri interi per le corde.
class MyComparer : IComparer<string>
{
public override int Compare(string x, string y)
{
int ix = x == "b" ? 0 : x == "c" ? 1 : 2;
int iy = y == "b" ? 0 : y == "c" ? 1 : 2;
return ix.CompareTo(iy);
}
}
var example = new List<string> { "c", "b", "a", "d", "foo", "", "1", "e"};
example.Sort(new MyComparer());
foreach (var s in example)
Console.WriteLine(s);
Produzione:
b
c1
e
un
d
foo
Nota che questo non è un tipo stabile. Se hai bisogno di un tipo stabile, c'è un po 'più di lavoro.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow