Autor Zpráva
blizzboz
Profil
Potreboval by som vedieť aká rýchla je práca s Linq to Xml

vo WPF ListBoxe mám vybraté položky a napísal som si funkciu ktorá mi z XML dokumentu (dataXml typu XDocument) vyberie presne tie elementy ktoré majú rovnaký id ako je názov vybratej položky v ListBoxe (id položky vracia metóda getItemId). Funguje to len by ma zaujímalo či je efektívne volať LINQ dotazy v cykle tak ako je to napr. v mojej funkcii. Zatiaľ to funguje perfektne aj rýchlosť je vpohode len je otázne či to bude také rýchle keď ten listbox bude obsahovať niekoľko stoviek alebo tisícok položiek.

        public List<XElement> GetSelectedContactElements()
        {
            var contacts = from community in dataXml.Descendants("community")
                           where community.Attribute("id").Value == SelectedCommunity
                           let contactElements = community.Descendants("contact")
                           from contact in contactElements
                           select contact;
            var list = new List<XElement>();
            foreach (var item in contactsListBox.SelectedItems)
            {
                var contact = (from c in contacts where c.Attribute("id").Value == getItemId(item) select c).First();
                list.Add(contact);
            }
            return list;
        }
martindeveloper
Profil
blizzboz:
Osobně jsem s LINQ obecně neměl žádnný rychlostní problémy v řádech stovek záznamů.
V tisících nemůžu soudit, ale osobně si myslím že by to neměl být problém, ale bylo by lepší to provést paralelně.

Možná bych doporučil se podívat na PLINQ (Parallel LINQ), paralelizace stávajících LINQ dotazů je triviální.

int[] numbers = new[] { 1, 2, 3, 4, 10, 20, 30, 40 };
int[] evenNumbers = numbers.Where(n => n % 2 == 0).ToArray();
int[] evenNumbers2 = numbers.AsParallel().Where(n => n % 2 == 0).ToArray();


Druhý dotaz bude mnohem rychlejší pokud pole bude mít obrovské rozměry.

Pozor pouze .NET 4!

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0