Coś zamiast foreach ?

Coś zamiast foreach ?
Antar
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
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

Kopiuj
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?

Kubuś Puchatek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 235
0

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

neves
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1114
2

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

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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?

Antar
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Tylko odnaleźć.

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0

No to w zupełności Where wystarczy.

BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 422
0

Może taka instrukcja byłaby odpowiednia?

Kopiuj
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?

Antar
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
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.

SL
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Bydgoszcz
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.