Ich versuche, eine Sortiermethode für eine IList<T>
, mit dem folgenden Code zu implementieren:InvalidCastException beim Gießen IList <T> zu IList
public static void Sort<T>(this IList<T> list, Comparison<T> comparison)
{
ArrayList.Adapter((IList)list).Sort(Comparer<T>.Create(comparison));
}
ich die Methode für eine Liste von Elementen eines bekannten Typs aufrufen und die Bereitstellung dieser Funktionen erzeugt Vergleich:
cardwraplayout.Children.Sort((x, y) =>
{
Card card1 = Cards.FindCardByIconId(x.Id);
Card card2 = Cards.FindCardByIconId(x.Id);
int result = card1.Rarity.CompareTo(card2.Rarity);
if (result == 0)
{
result = card1.Name.CompareTo(card2.Name);
}
return result;
});
Wenn ich das obige Verfahren nennen, ein InvalidCastException
an dieser Linie auftritt: ArrayList.Adapter((IList)list).Sort(Comparer<T>.Create(comparison));
:
System.InvalidCastException: Specified cast is not valid.
Warum kann ich meine IList<T>
nicht in IList
umwandeln, um meine eigene Sortierfunktion zu implementieren?
Update 1: Versuchte Änderung Comparer<T>
zu Comparer<object>
, löst immer noch die gleiche Ausnahme aus.
public static void Sort<T>(this IList<T> list, Comparison<object> comparison)
{
ArrayList.Adapter((IList)list).Sort(Comparer<object>.Create(comparison));
}
Image img1;
Image img2;
cardwraplayout.Children.Sort((x,y) =>
{
img1 = (Image)x;
img2 = (Image)y;
Card card1 = Cards.FindCardByIconId(img1.Id);
Card card2 = Cards.FindCardByIconId(img2.Id);
int result = card1.Rarity.CompareTo(card2.Rarity);
if (result == 0)
{
result = card1.Name.CompareTo(card2.Name);
}
return result;
});
Update 2: Erstellen einer Comparer-Klasse wird nicht funktionieren, weil ich mehrere Felder von einer anderen Klasse zugreifen müssen, die mir den folgenden Fehler geben:
An object reference is required for the nonstatic field, method, or property "Cards"
Es gibt keine implizite Umwandlung von "IList" nach "IList' AFAIK. Die 2 Schnittstellen sind einfach nicht kompatibel. Sie könnten einfach 'list.ToArray(). Sortieren ...' –
apokryfos
@apokryfos würde das meine IList ändern oder ein neues Array erstellen? Das erneute Löschen und Wiederauffüllen der Liste ist zu teuer. –
Können Sie die Ausnahme bitte posten? – stybl