1

我有一个实现 MyItems 列表的类。我想要一种从该列表中删除某些元素的方法,它应该返回已删除的项目。这是我尝试过的:

public class MyItemList : List<MyItem>
{
    ...

    public MyItemList cutOff(int count)
    {
        MyItemList result = this.GetRange(0, count);
        this.RemoveRange(0, count);
        return result;
    }

不幸的是 GetRange() 返回 List 但不是 MyItemList :( 我怎样才能以更好的方式处理这个问题?铸造不起作用。必须有一种优雅的方法来解决这个非常简单的问题并保持在 MyItemList 类型内(没有肮脏的黑客)。

提前致谢!

4

3 回答 3

3

这应该可以解决问题,但我强烈建议重新设计组合,您将在内部存储 List

public class MyItemList : List<MyItem>
{
    public MyItemList(){}

    public MyItemList(IEnumerable<MyItem> sequence): base(sequence) {}

    public MyItemList cutOff(int count)
    {
        MyItemList result = new MyItemList(this.GetRange(0, count));
        this.RemoveRange(0, count);
        return result;
    }
}

还可以考虑创建列表的开放泛型类型,例如MyList<T> : List<T>MyList<T> : List<T> where T : MyItem以便该类的客户端可以利用泛型

编辑:好的,我已经List<T>为扩展方法实现了通用版本,这将帮助您对 MyItemList 类之外的列表进行更通用的逻辑

public static class ListExtensions
{
    public static List<T> CutOff<T>(this List<T> list, int count)
    {
        var result = list.GetRange(0, count);
        list.RemoveRange(0, count);
        return result;
    }
}

现在你可以

var list = new List<int> {1,2,3,4,5,6};

Console.WriteLine ("cutted items:");
Console.WriteLine (string.Join(Environment.NewLine, list.CutOff(2)));

Console.WriteLine ("items in list:");
Console.WriteLine (string.Join(Environment.NewLine, list));

印刷:

cutted items:
1
2
items in list:
3
4
5
6

另一个注意事项:

我建议这样做

public class MyItemList<T> : IList<T> where T : MyItem
{
     private List<T> list;

     //here will be implementation of all methods required by IList
     //that will simply delegate to list field

}

请注意,如果所有逻辑MyItemList都是通用的(可以应用于List<T>, likeCutoff方法),您可能不需要单独的类。也是where T : MyItem可选的,仅当您访问MyItem在 MyItemList中定义的方法时才需要

于 2013-04-02T23:22:09.230 回答
2

你可以只返回一个List<MyItem>MyItem[]删除的项目。或使用采用 ienumerable 的 List<> 构造函数。

没有编译这个 - 但应该没问题

public class MyItemList : List<MyItem>
{
   // def ctor
   public MyItemList() {}

   public MyItemList(IEnumerable<MyItems> items): base(items) {}

   public MyItemList cutOff(int count)
    {
        MyItemList result = new MyItemList(this.GetRange(0, count));
        this.RemoveRange(0, count);
        return result;
    }
}
于 2013-04-02T23:25:20.407 回答
1

不要继承自List<MyItem>( 除非您要做的只是避免键入尖括号。而是将a封装List<MyItem>为您的类的后备存储并仅公开您的问题域所需的特定/方法和属性。通过继承 from List<MyObject>,您的正在泄漏实现细节并将自己绑定到特定类型的后备存储。您希望保持完成工作所需的最小公共表面积。这样做有助于测试,并使未来的更改更容易。

如果您希望与标准 SCG 集合类型具有互操作性,请仅实现您需要的接口——最好是显式实现。

于 2013-04-02T23:49:25.827 回答