我正在尝试使用以下代码为IList<T>
实现Sort方法:
public static void Sort<T>(this IList<T> list, Comparison<T> comparison)
{
ArrayList.Adapter((IList)list).Sort(Comparer<T>.Create(comparison));
}
我正在调用已知类型元素列表的方法,并提供此比较功能:
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;
});
当我调用上述方法时,此行发生InvalidCastException
:ArrayList.Adapter((IList)list).Sort(Comparer<T>.Create(comparison));
:
System.InvalidCastException:指定的强制转换无效。
为什么我不能将IList<T>
投射到IList
以实现我自己的排序功能?
更新1:
尝试将Comparer<T>
更改为Comparer<object>
,仍会引发相同的异常。
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;
});
更新2: 创建一个Comparer类是行不通的,因为我需要从另一个类访问几个字段,这会给我以下错误:
非静态字段,方法或的对象引用是必需的 财产“卡”
答案 0 :(得分:2)
为什么我不能将
IList<T>
投射到IList
以实现我自己的排序功能?
这取决于您收到的列表的具体类型。 IList<T>
未实施IList
。具体类可以选择实现IList<T>
和IList
,仅实现IList<T>
,仅实现IList
,或者不实现IList<T>
。两者之间没有固有的关系只因为他们有共同的名字。
例如:
List<T>
和Collection<T>
同时实施。ArraySegment<T>
仅实现IList
,而不是IList
。StringCollection
仅实现IList<string>
,而不是IList
。通过转换为IList
,你告诉编译器&#34;没关系,我比你知道的更多,我知道我已经真正实现的课程IList
&#34。但是在这种情况下,班级没有实现IList<T>
。因此失败了。
要对IList<T>
进行排序,请创建适用于IList
的内容,不要试图获取为T[]
生效的内容。例如,您可以将所有内容复制到Array.Sort
,调用ArrayList.Adapter(...).Sort(...)
,然后复制结果。 (实际上,这比add_filter( 'woocommerce_add_cart_item_data', 'limit_cart_to_one_item' );
function limit_cart_to_one_item( $cart_items ) {
WC()->cart->empty_cart();
return $cart_items;
}
所做的更有效。)或者您可以手动编码其中一种标准搜索算法。