Skocz do zawartości

endrjuh

Członkowie
  • Postów

    4
  • Dołączył

  • Ostatnio

  • Days Won

    1

Posty napisane przez endrjuh

  1. 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 :D

    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ół ;)

    • Upvote 1
×
×
  • Utwórz nowe...