gpt4 book ai didi

c# - 派生类中的 List 和 GetRange() 问题

转载 作者:太空宇宙 更新时间:2023-11-03 19:16:53 27 4
gpt4 key购买 nike

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

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

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

不幸的是 GetRange() 返回列表而不是 MyItemList :(我怎样才能更好地处理这个问题?类型转换不起作用。必须有一种优雅的方法来解决这个非常简单的问题并保留在 MyItemList 类型中(没有肮脏的黑客)。

提前致谢!

最佳答案

这应该可以解决问题,但我强烈建议重新设计组合,您将在内部存储 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> ,如 Cutoff 方法),您可能不需要单独的类。还有 where T : MyItem是可选的,仅当您访问 MyItem 中定义的方法时才需要在我的项目列表

关于c# - 派生类中的 List<T> 和 GetRange() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15776154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com