Tylko jeden obiekt z kolekcji

0

Chcę zrobić "przeglądarkę" kolekcji, jednak bez jednoczesnego dostępu do wszystkich jej elementów (czyli bez ListBox'a czy ComboBox'a).
Kolejne elementy listy byłyby dostępne wyłącznie poprzez buttony [Prev] i [Next]

Jedyne co przychodzi mi do głowy to użycie zmiennej globalnej:

        private void btn_prv_Click(object sender, RoutedEventArgs e)
        {
            var_global--;

            Refresh_View(var_global);
        }

        private void btn_nxt_Click(object sender, RoutedEventArgs e)
        {
            var_global++;

            Refresh_View(var_global);
        }

        private void Refresh_View(List<Element> my_list, var_global)
        {
            view_name.Text = my_list[var_global].Name;
            view_data.Text = my_list[var_global].Data;
        }

Pytanie brzmi: czy przy tego typu projekcie jest jakaś możliwość uniknięcia zmiennej lokalnej?

0

Zamiast korzystać z wbudowanej List napisz własną kolekcję z metodami Next i Prev i tam trzymaj ten stan. W środku oczywiście może korzystać z List.

4

@Antar: Możesz wykorzystać LinkedList<T>, która udostępnia właściwości Next, Previous i trzymać tylko aktualny element w zmiennej.

1

Można też to zrobic tak:

    public class MyClass<T>
    {
        public MyClass(IEnumerable<T> list)
        {
            this.list = list.ToList();
        }

        private List<T> list;
        public T Current { get; private set; }
        public T MoveCurrentToFirst { get { Current = list.First(); return Current; } }
        public T MoveCurrentToLast { get { Current = list.Last(); return Current; } }
        public T MoveCurrentToNext { get { Current = list[list.IndexOf(Current)+1]; return Current; } }
    }
MyClass<int> mycollection = new WpfApp1.MyClass<int>(new int[] { 5, 2, 1, 6 });
int n = mycollection.MoveCurrentToFirst;
n = mycollection.MoveCurrentToNext;

oczywiście trzeba posprawdzać czy indeks nie wykracza poza zakres itp

3

Tylko po co robić samemu gorszą wersję czegoś, co już jest?

0

@somekind: No ja akurat czerpię przyjemność z tego, a skorzystać z gotowego produktu zawsze można ;P

0
public class MyClass<T>
    {
        public MyClass(IEnumerable<T> list)
        {
            this.list = list.ToList();
        }

        private List<T> list;
        public T Current { get; private set; }
        public MyClass<T> MoveCurrentToFirst() {  Current = list.First(); return this; }
        public MyClass<T> MoveCurrentToLast() { Current = list.Last(); return this;  }
        public MyClass<T> MoveCurrentToNext() {  Current = list[list.IndexOf(Current)+1]; return this;  }
    }
MyClass<int> mycollection = new WpfApp1.MyClass<int>(new int[] { 5, 2, 1, 6 });
int n = mycollection.MoveCurrentToFirst().MoveCurrentToNext().Current;

1 użytkowników online, w tym zalogowanych: 0, gości: 1