我使用此代码在类的实例之间移动
public class Orders : List<Order>
{
int currentIndex = 0;
public int CurrentIndex {
get {
if (currentIndex == Count) {
currentIndex = 0;
} else if (currentIndex > Count - 1) {
currentIndex = Count - 1;
} else if (currentIndex < 0) {
currentIndex = 0;
}
return currentIndex;
}
set { currentIndex = value; }
}
public void MoveNext()
{
currentIndex++;
}
public void MovePrevious()
{
currentIndex--;
}
public Order Current {
get {
return this[CurrentIndex];
}
}
}
public class Cart
{
public string id_ordine { get; set; }
public string nome { get; set; }
public string cognome { get; set; }
public double prezzo { get; set; }
}
但我无法弄清楚如何使用包含类似下列情况的列表的复杂类。 我已经用很多方式试过了..
public class Order
{
public string nome { get; set; }
public string cognome { get; set; }
public List<OrdersList> ordersList { get; set; }
}
public class OrdersList
{
public string id_ordine { get; set; }
public double prezzo { get; set; }
}
更具体的考虑因素,我有一个包含更多订单列表的订单
例如
order orderslist
-------------+-----------------
name surname id_ordine prezzo
-------------+-----------------
john doe --> 1 10
--> 2 12
--> 3 22
答案 0 :(得分:0)
我会采取完全不同的方法。项目列表自然没有“光标” - 能够拥有多个游标(如书中的多个书签)是完全合乎逻辑的。
我会坚持使用List<OrdersList>
列表本身,但使用IndexedListEnumerator<T>
扩展方法(可能在GetIndexedEnumerator()
上)创建IList<T>
类型或类似内容。这将实现IEnumerator<T>
,但也有MovePrevious()
方法和Index
属性。
从“我想要一个订单列表”的关注中分离出对“我希望有一个更灵活的游标”的关注。
我还强烈建议,除非你真的,真的需要你现有的那种“环绕”功能,你才能使索引成为一个简单的属性,但是要{{1尝试访问无效索引时抛出异常。 (因此初始索引将为-1,Current
将无效。调用Current
将使您索引0,这对任何非空列表都有效,等等。)作为粗略草图:
MoveNext()
示例用法,但您通常要检查public static class ListExtensions
{
public static IndexedListEnumerator<T> GetIndexedListEnumerator<T>(this IList<T> list) =>
new IndexedListEnumerator<T>(list);
}
public sealed class IndexedListEnumerator<T> : IEnumerator<T>
{
private readonly IList<T> list;
// You *could* restrict this to the range [-1, list.Count] if you wanted.
public int Index { get; set; }
// You might want to make this public
private bool IndexIsValid => Index >= 0 && Index < list.Count;
public IndexedListEnumerator(IList<T> list)
{
this.list = list;
Index = -1; // Before the first element
}
// TODO: Consider using checked to throw an exception around int.MaxValue
public bool MoveNext()
{
Index++;
return IndexIsValid;
}
public bool MovePrevious()
{
Index--;
return IndexIsValid;
}
public T Current => list[Index];
object IEnumerator.Current => Current;
void IDisposable.Dispose() {}
void IEnumerator.Reset() => Index = -1;
}
和MovePrevious()
的结果:
MoveNext()