Coś zamiast foreach ?

0

Cześć,

Posiadam dwie kolekcje obiektów, z których jedna (data) gromadzi niezbędne dane, natomiast kolekcja (to_do) gromadzi listę danych do dalszego przetworzenia.
W celu operacji na właściwych rekordach, kolekcje posiadają wartość "number" wspólną dla obu kolekcji.

Aby wykonać jakąkolwiek operację jest stworzona pętla w pętli:

przeszukiwana jest lista "to_do" pod kątem sprawdzenia dla jakich rekordów (numerów) wymagane jest jakieś działanie;
przeszukiwana jest lista "data" pod katem zgodności "number" w celu pobrania danych wstępnych do dalszej obróbki

foreach (var c in to_do) 
{
    if (c.action == 1) // jeżeli dla tego rekordu musi być wykonana operacja A;
    {
        foreach (var d in data)
        {
            if (c.number = d.number)   // znajdź rekord z tym samym numerem
            {
                // załaduj wymagane dane z "d" do zmiennych lokalnych
                byte x = d.red;
                ...
                break;
            }
        }
    }
}

Pytanie:
Czy da się to jakoś efektywniej przeszukiwać kolekcje niż za pomocją pętli foreach w celu odnalezienia konkretnego rekordu?

0

Linq ?
Np.
To_do.FirstOrDefault(× => x.Costam == "cos")

2

Zamiast dwóch pętli foreach, potrzebujesz jedną z nich zapewne zastąpić jakąś strukturą umożliwiającą szybkie wyszukiwanie np Dictionary, HasSet.

0
Antar napisał(a):

Pytanie:
Czy da się to jakoś efektywniej przeszukiwać kolekcje niż za pomocją pętli foreach w celu odnalezienia konkretnego rekordu?

A jaki jest cel? Chcesz tylko znaleźć elementy w kolekcji data, które mają odpowiedniki w to_do, czy utworzyć z nich nową kolekcję obiektów?

0

Tylko odnaleźć.

0

No to w zupełności Where wystarczy.

0

Może taka instrukcja byłaby odpowiednia?

data
  .Where(d => to_do.Any(c => c.action == 1 && c.number == d.number))
  .ToList()
  .ForEach(d => SomeOperation(d.red));

Martwi mnie tylko Twoja instrukcja break w drugiej pętli. Jeśli kolekcja data ma więcej niż jedno dopasowanie dla konkretnego elementu z kolekcji to_do, to powinna obsłużyć tylko pierwszy znaleziony? Zakładasz, że będą takie przypadki czy umieściłeś break, żeby uniknąć dalszych niepotrzebnych porównań w instrukcji warunkowej, bo nigdy taka sytuacja się nie zdarzy?

0

Martwi mnie tylko Twoja instrukcja break w drugiej pętli. Jeśli kolekcja data ma więcej niż jedno dopasowanie dla konkretnego elementu z kolekcji to_do, to powinna obsłużyć tylko pierwszy znaleziony? Zakładasz, że będą takie przypadki czy umieściłeś break, żeby uniknąć dalszych niepotrzebnych porównań w instrukcji warunkowej, bo nigdy taka sytuacja się nie zdarzy?

Dokładnie. Zakładam że "numer" jest wielkością unikalną (coś jak "id"), więc nie ma potrzeby, aby kolekcja była dalej przeszukiwana.
'break' jest tutaj dodane specjalnie w celu oszczędności czasu.

0

a może wystarczy Ci Intersect? Znajdziesz tym cześć wspólną zbiorów.

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