在复杂对象列表之间迭代

时间:2018-05-17 07:02:11

标签: c#

我使用此代码在类的实例之间移动

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

1 个答案:

答案 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()