C# - Lista stringów do tablicy dwuwymiarowej

0

Chciałbym przenieść listę stringów do tablicy dwuwymiarowej ale w taki sposób aby stringi z listy podzielić na dwa wymiary w miejscu w którym jest ";".
"Co1;Pstro1","Co2;Pstro2" itd

w Liście na

{"Co1","Pstro1"},{"Co2","Pstro2"}

W tablicy.

Zamysł jest taki że mam 2 listy. Składające się że stringów w których występuje średnik. Listy chce ze sobą skleić w taki sposób że jeśli w jednej i drugiej liście to co znajduje się przed pierwszym średnikiem jest takie samo to powinno utworzyć to jeden element. Wymyśliłem że zamienię listy na tabele dwuwymiarowe i będę porównywał pierwsze wymiary jeśli będą sobie równe to drugie wymiary skleję.

0

O to chodzi?

var strings = new List<string>
{
    "Co1;Pstro1",
    "Co2;Pstro2",
    "Co1;Pstro3"
};

var lookup = strings.Select(s => s.Split(";")).ToLookup(s => s[0], s => s[1]);

foreach (var x in lookup)
{
    // Co1: Pstro1,Pstro3
    // Co2: Pstro2
    Console.WriteLine(x.Key + ": " + string.Join(',', x.Select(_ => _)));
}
0

Nie wiem, co robisz, więc może mój post nie będzie miał żadnego znaczenia. Pomyśl o tym, żeby robić to w pełni obiektowo. Może tak to powinno być:

public class Model
{
  public string Signal {get;set;}
  public string Response {get;set;}
}

I wtedy masz po prostu tablicę lub listę obiektów klasy Model.

0
nobody01 napisał(a):

O to chodzi?

var strings = new List<string>
{
    "Co1;Pstro1",
    "Co2;Pstro2",
    "Co1;Pstro3"
};

var lookup = strings.Select(s => s.Split(";")).ToLookup(s => s[0], s => s[1]);

foreach (var x in lookup)
{
    // Co1: Pstro1,Pstro3
    // Co2: Pstro2
    Console.WriteLine(x.Key + ": " + string.Join(',', x.Select(_ => _)));
}

bardziej chodzi o coś takiego
list1 ----------------------------- list2 -------------------------- wynikowa
{Co1; Pstro1} -------------- {Co1; No1} ------------------------- {Co1; Pstro1+No1}
{Co2; Pstro2} -------------- {Co2; No2} ------------------------- {Co2; Pstro2+No2}
{Co3; Pstro3} -------------- {Co3; No3} ------------------------- {Co3; Pstro3+No3}

czyli chodzi o to żeby znaleźć argument z list (to co przed średnikiem) w list2 i dokleić mu to co się znajduje w list2 po średniku. Wynik może być w list1 albo w nowej list3 albo do jakiejś tablicy. Zastanawiam się jak to powinno być prosto i zgrabnie.

3

Prosto i zgrabnie:

var list1 = new List<string>
{
    "Co1;Pstro1",
    "Co2;Pstro2",
    "Co3;Pstro3"
};

var list2 = new List<string>
{
    "Co1;No1",
    "Co2;No2",
    "Co3;No3"
};

var map1 = list1.Select(x => x.Split(';')).ToDictionary(x => x[0], x => x[1]);
var map2 = list2.Select(x => x.Split(';')).ToDictionary(x => x[0], x => x[1]);

var result = map1.Zip(map2, (first, second) => $"{first.Key};{first.Value}+{second.Value}");
0

@aksimoN: mogę, ale w poście, a nie w komentarzu.

Metoda Zip wykonuje operacje na odpowiadających elementach dwóch kolekcji. W moim kodzie element z pierwszej kolekcji jest w first, a z drugiej w second, dalej już budowany jest string według wzorca, który podałeś.

Jeśli kolekcje są różnej długości albo nie zawierają tych samych kluczy, to mój kod nie zadziała tak, jak chcesz, bo część elementów nie zostanie przypisana w ogóle, a inne w złej kolejności. Jeśli to jest problemem i chcesz dopasowywać elementy po kluczu, to Zip się nie nadaje, można za to np.:

var result = map1.Where(x => map2.ContainsKey(x.Key)).Select(x => $"{x.Key};{x.Value}+{map2[x.Key]}");

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