Skocz do zawartości

endrjuh

Członkowie
  • Postów

    4
  • Dołączył

  • Ostatnio

  • Days Won

    1

Wszystko napisane przez endrjuh

  1. endrjuh

    Linq to XML

    Wydaje mi się, że iterowanie po wszystkich węzłach i wyciąganie danych tylko z tych węzłów, które nas interesują nie jest najlepszym pomysłem. Lepiej wyciągnąć tylko węzły znaczące, np. najpierw stworzyć kolekcję węzłów row i następnie z nich wyciągać te węzły col które mają dla zadanego atrybutu konkretne wartości - np. wszystkie col które w wartości atrybutu name zawierają ciąg 'name'. Można to zrobić takim np. zapytaniem (wyświetli wyciągnięte dane oddzielone spacją): List<string> rowsDetails = xml.Descendants() .Where(x => x.Name == "row") .Select(row => string.Join(" ", row.Descendants() .Where(x => x.Name == "col" && ((string)x.Attribute("name")).Contains("name")) .Select(y => y.Value) ) ).ToList(); rowsDetails.ForEach(Console.WriteLine); Oczywiście jeżeli zamierzamy robić coś więcej z danymi z XMLa to zamiast List<string> należy użyć listy obiektów prezentujących dane z każdego wiersza - np List<RowDetail> i wówczas można to zrobić tak: public class RowDetails { public string Name1 { get; set; } public string Name2 { get; set; } public string Name3 { get; set; } ... } ... List<RowDetails> rowsDetails = xml.Descendants().Where(x => x.Name == "row").Select(row => { var desc = row.Descendants().Where(x => x.Name == "col"); var xElements = desc as List<XElement> ?? desc.ToList(); var n1 = xElements.FirstOrDefault(x => (string)x.Attribute("name") == "name1")?.Value; var n2 = xElements.FirstOrDefault(x => (string)x.Attribute("name") == "name2")?.Value; var n3 = xElements.FirstOrDefault(x => (string)x.Attribute("name") == "name3")?.Value; ... return new RowDetails() { Name1 = n1, Name2 = n2, Name3 = n3 ... }; }).ToList();
  2. Nazwanie używania 'var' lenistwem programistycznym to zdecydowanie nadużycie. Dla przykładu, w moim subiektywnym odczuciu dużo wygodniej czyta się var systemTimeZonesList = TimeZoneInfo.GetSystemTimeZones().ToList();niż List<TimeZoneInfo> systemTimeZonesList = TimeZoneInfo.GetSystemTimeZones().ToList(); Szczególnie uwzględniając fakt, że po najechaniu kursorem na słowo kluczowe 'var' wyświetlany jest w eleganckim tooltipie typ zmiennej. Chyba, że ktoś nie korzysta z VS Myślę, że używając 'var'a kluczowe jest nadawanie odpowiednich nazw zmiennych. Gdyby w powyższym przykładzie zamiast systemTimeZonesList programista nazwał zmienną stzl, czytający faktycznie mógłby mieć problem z rozszyfrowaniem kodu. Sam do niedawna wzbraniałem się przed korzystaniem z 'var', ale teraz nie wyobrażam sobie życia bez niego, szczególnie w połączeniu z LINQ i typami anonimowymi. Oczywiście, można prowadzić wielogodzinne dyskusje czy korzystanie z 'var' jest dobre czy złe, czy to dobra praktyka czy lenistwo programistyczne - ale po co? Każdy używa jak mu wygodniej albo tak jak ustali zespół
×
×
  • Utwórz nowe...