Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 铸造IList时出现无效铸造异常<;T>;使屈服_C#_List_Linq - Fatal编程技术网

C# 铸造IList时出现无效铸造异常<;T>;使屈服

C# 铸造IList时出现无效铸造异常<;T>;使屈服,c#,list,linq,C#,List,Linq,我正在尝试使用以下代码为IList实现排序方法: public static void Sort<T>(this IList<T> list, Comparison<T> comparison) { ArrayList.Adapter((IList)list).Sort(Comparer<T>.Create(comparison)); } 当我调用上述方法时,在这一行出现InvalidCastException:ArrayList.Ada

我正在尝试使用以下代码为
IList
实现排序方法:

public static void Sort<T>(this IList<T> list, Comparison<T> comparison)
{
    ArrayList.Adapter((IList)list).Sort(Comparer<T>.Create(comparison));
}
当我调用上述方法时,在这一行出现
InvalidCastException
ArrayList.Adapter((IList)list).Sort(Comparer.Create(comparation))

System.InvalidCastException:指定的强制转换无效

为什么我不能将我的
IList
转换为
IList
,以实现我自己的排序功能

更新1: 尝试将
比较器
更改为
比较器
,仍会引发相同的异常

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;
});
公共静态无效排序(此IList列表,比较)
{
Adapter((IList)list).Sort(Comparer.Create(comparation));
}
图像img1;
图像img2;
cardwraplayout.Children.Sort((x,y)=>
{
img1=(图像)x;
img2=(图像)y;
Card card1=Cards.FindCardByIconId(img1.Id);
Card card2=Cards.FindCardByIconId(img2.Id);
int result=card1.Rarity.CompareTo(card2.Rarity);
如果(结果==0)
{
结果=card1.Name.CompareTo(card2.Name);
}
返回结果;
});
更新2: 创建比较器类将不起作用,因为我需要从另一个类访问多个字段,这将导致以下错误:

非静态字段、方法或对象需要对象引用 财产“卡”

为什么我不能将我的
IList
转换为
IList
,以实现我自己的排序功能

这取决于您收到的列表的具体类型<代码>IList
未实现
IList
。具体类可以选择实现
IList
IList
,只实现
IList
,只实现
IList
,或者两者都不实现。这两者之间没有内在的联系,仅仅因为它们有共同的名字

例如:

  • 并实现这两个目标
  • 仅实现
    IList
    ,而不是
    IList
  • 仅实现
    IList
    ,而不是
    IList
通过转换到
IList
,您告诉编译器“没关系,我知道的比您多,我知道我得到的类确实实现了
IList
”,但在本例中,类没有实现
IList
。因此失败了

要对
IList
进行排序,请创建适用于
IList
的内容,不要尝试获取适用于
IList
的内容。例如,您可以将所有内容复制到
T[]
,调用
数组。排序
,然后复制回结果。(实际上,这比
ArrayList.Adapter(…).Sort(…)
无论如何都要做的更有效。)或者您可以手工编写一种标准搜索算法

为什么我不能将我的
IList
转换为
IList
,以实现我自己的排序功能

这取决于您收到的列表的具体类型<代码>IList未实现
IList
。具体类可以选择实现
IList
IList
,只实现
IList
,只实现
IList
,或者两者都不实现。这两者之间没有内在的联系,仅仅因为它们有共同的名字

例如:

  • 并实现这两个目标
  • 仅实现
    IList
    ,而不是
    IList
  • 仅实现
    IList
    ,而不是
    IList
通过转换到
IList
,您告诉编译器“没关系,我知道的比您多,我知道我得到的类确实实现了
IList
”,但在本例中,类没有实现
IList
。因此失败了



要对
IList
进行排序,请创建适用于
IList
的内容,不要尝试获取适用于
IList
的内容。例如,您可以将所有内容复制到
T[]
,调用
数组。排序
,然后复制回结果。(这实际上比
ArrayList.Adapter(…).Sort(…)
无论如何都要做的更有效。)或者你可以手工编写一个标准的搜索算法。

IList
IList
AFAIK没有隐式转换。这两个接口根本不兼容。您可以只执行
list.ToArray().Sort…
@apokryfos,这会修改我的IList还是创建一个新数组?再次清除和重新填充列表的费用太高。请发布例外情况好吗?@apokryfos在这种情况下,我应该问一个关于如何对IList排序的单独问题吗?实际上,问题是您需要使用
对象
比较器,而不是
T
比较器。不知何故,我忽略了从
IList
IList
AFAIK没有隐式转换。这两个接口根本不兼容。您可以只执行
list.ToArray().Sort…
@apokryfos,这会修改我的IList还是创建一个新数组?再次清除和重新填充列表的费用太高。请发布例外情况好吗?@apokryfos在这种情况下,我应该问一个关于如何对IList排序的单独问题吗?实际上,问题是您需要使用
对象
比较器,而不是
T
比较器。不知何故,我忽略了这一点,但它的效率很低(因为我正在修改的IList是只读的-虽然是可变的,但我必须清除并手动重新添加数组内容)@NicodeOry如果您能够修改它,它肯定不是只读的?我不明白你的意思。我正在使用Xamarin.Forms并修改布局的子项。显然,他们的API是设计成这样的,所以你不能做
layout.Children=myArray
,但是你可以做
layout.Children.Add(item)
@NicodeOry啊,好吧,这是一个非常特殊的情况。通常,对于
IList
,您可以简单地将特定索引设置为一个值,但这可能不起作用。在该sp中
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;
});