gpt4 book ai didi

c# - 继承 IComparable 的接口(interface)引用对象的排序列表

转载 作者:太空狗 更新时间:2023-10-30 01:01:35 26 4
gpt4 key购买 nike

我在使用 list.Sort() 获取指向不同类型的接口(interface)引用列表时遇到了问题,但是问题 Sort a list of interface objects提供了以下解决方案

interface IFoo : IComparable<IFoo> 
{
int Value { get; set; }
}

class SomeFoo : IFoo
{
public int Value { get; set; }

public int CompareTo(IFoo other)
{
// implement your custom comparison here...
}
}

在我的原始代码中,而不是 IFoo 从 IComparable 继承,我的类是从 IFoo 和 ICompareable 继承,即

interface IFoo
{
int Value { get; set; }
}

class SomeFoo : IFoo, IComparable<IFoo>
{
public int Value { get; set; }

public int CompareTo(IFoo other)
{
// implement your custom comparison here...

}
}
class SomeBar : IFoo, IComparable<IFoo>
{
public int Value { get; set; }

public int CompareTo(IFoo other)
{
// implement your custom comparison here...
}
}

但是当我尝试对 IFoo 引用列表进行排序时,出现了错误 Failed to compare two elements in the array.

List<IFoo> iFoos = new List<IFoo> 
{
new SomeFoo{Value = 1},
new SomeFoo{Value = 15},
new SomeFoo{Value = 390},
new SomeBar{Value = 2},
new SomeBar{Value = 78},
new SomeBar{Value = 134}
}

iFoos.Sort();

谁能解释为什么我的原始代码不起作用?

最佳答案

你的列表是IFoo的列表秒。因此,从列表(及其排序操作)的角度来看,它只看到该接口(interface)而不知 Prop 体类型。

所以当它尝试订购两个 IFoo 时s,它不能那样做,因为 IFoo不执行 IComparable .

问题是仅仅因为你的两种类型都实现了 IComparable<Foo>另外,不能保证所有 IFoo列表中的元素这样做。所以操作是不安全的。

为了能够使用 IComparable<IFoo> 对元素进行排序, IFoo接口(interface)需要自己实现接口(interface)。


或者,您也可以实现 IComparer<IFoo>并将其传递给 Sort()然后委托(delegate)给相应的实际实现。当然,这不是一个真正优雅的解决方案,也不是很适合 future (如果您创建了 IFoo 的新实现):

class FooComparer : IComparer<IFoo>
{
public int Compare(IFoo a, IFoo b)
{
if (a is SomeFoo)
return ((SomeFoo)a).CompareTo(b);
else if (a is SomeBar)
return ((SomeBar)a).CompareTo(b);
else
throw new NotImplementedException("Comparing neither SomeFoo nor SomeBar");
}
}

当然,如果你的意思是IFoo为了比较,你应该有那个接口(interface)实现 IComparable<IFoo>直接而不是依赖子类型来这样做。 IFoo是一个契约(Contract),可排序是一个很好的要求。

关于c# - 继承 IComparable<T> 的接口(interface)引用对象的排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38184918/

26 4 0
文章推荐: c# - 来自 IEnumerable 的 GenericTypeDefinitionName