none
2 listbox'a split RRS feed

  • Soru

  • string file = Properties.Resources.düzenli;   

    komutuyla programıma eklediğim txt belgem var yüzlerce satır var bu belgede ve bunu 2 listbox'a # a göre parçalamak istiyorum

    #tan öncesi listbox1de #tan sonrası listbox2de olacak nasıl yapabilirim?

    25 Ağustos 2016 Perşembe 18:49

Yanıtlar

  • o zaman iki defa split yapman gerekecek

    string totalText = resource....;
    string totalText = totalText.Replace("\r", "");
    string[] totalLines = totalText.Split('\n');
    foreach (string line in totalLines) {
      string[] splitedLine = line.Split('#');
      Combobox1.Items.Add(splitedLine[0]);
      Combobox2.Items.Add(splitedLine[1]);
    }
    

    Yukarıda ki \r yi replace etmemizin sebebi \r\n yani yeni satır karakterleri iki harf olduğu için split etmekte birini kulllanacağız. Splitten sonra diğer karakter ortalıkta kalmasın diye temizliyoruz. Gerisi aynı mantık istediğin şeyi sağlar bu.


    Fullstack Developer

    • Yanıt Olarak İşaretleyen SelimBerkay 25 Ağustos 2016 Perşembe 20:53
    25 Ağustos 2016 Perşembe 19:41
  • Ayni degiskeni iki kere tanimlayamazsin, totalText'in ikinci kullaniminda basinda string olmamali (stringler immutable oldugundan dogrudan yeni bir degisken kullanabilirsin).

    string file = Properties.Resources.düzenli;
    var items = File.ReadAllLines(file)
                .Where(line => line.Contains('#'))
                .Select(line => line.Split('#'))
                .Select( parts => new {
                   item1 = parts[0],
                   item2 = parts[1] });
    
    lstBox1.DataSource = items.Select(i => i.item1).ToList();
    lstBox2.DataSource = items.Select(i => i.item2).ToList();
    
    Tabii tek bir listeye indexiyle birlikte Tuple olarak alabillirsin ve ayni listeyi her iki listbox'in da datasource'u yapabilirsin. Ancak o zaman listbox secimleri senkronize olacaktir (birisinde 2.satiri secince digerinde de secilmesi gibi), bu istemedigin bir durum herhalde. 

    • Yanıt Olarak İşaretleyen SelimBerkay 25 Ağustos 2016 Perşembe 21:43
    25 Ağustos 2016 Perşembe 21:37
    Yanıtlayıcı

Tüm Yanıtlar

  • sanırım satırları okuyarak her satırı # sembolüyle ikiye böleceksin. Şu kod işini çözebilir

    System.IO.Stream.StreamReader sr = new System.IO.Stream.StreamReader("c:\\my.txt");
    while (sr.Peek() >= 0) {
      string line = sr.ReadLine();
      string[] splitedLine = line.Split('#');
      Combobox1.Items.Add(splitedLine[0]);
      Combobox2.Items.Add(splitedLine[1]);
    }
    sr.Close();


    Fullstack Developer

    25 Ağustos 2016 Perşembe 18:59
  • string file = Properties.Resources.düzenli;

    SystemReader ile yapabiliyorum ama bana gereken yukarıdaki stringe göre parçalamak her satırı bölmeyeceğim örneğin şöyle satırlar var

    bir#şey

    hakan#ahmet

    ben bunları şu şekle getirmek istiyorum

    listbox1 içeriği

    bir

    hakan

    listbox2 içeriği

    şey

    ahmet

    25 Ağustos 2016 Perşembe 19:26
  • o zaman iki defa split yapman gerekecek

    string totalText = resource....;
    string totalText = totalText.Replace("\r", "");
    string[] totalLines = totalText.Split('\n');
    foreach (string line in totalLines) {
      string[] splitedLine = line.Split('#');
      Combobox1.Items.Add(splitedLine[0]);
      Combobox2.Items.Add(splitedLine[1]);
    }
    

    Yukarıda ki \r yi replace etmemizin sebebi \r\n yani yeni satır karakterleri iki harf olduğu için split etmekte birini kulllanacağız. Splitten sonra diğer karakter ortalıkta kalmasın diye temizliyoruz. Gerisi aynı mantık istediğin şeyi sağlar bu.


    Fullstack Developer

    • Yanıt Olarak İşaretleyen SelimBerkay 25 Ağustos 2016 Perşembe 20:53
    25 Ağustos 2016 Perşembe 19:41
  • Error 1 A local variable named 'totalText' is already defined in this scope

    hatası alıyordum

     string totalText = Properties.Resources.düzenli;
                string cıktı = totalText.Replace("\r", "");
                string[] totalLines = cıktı.Split('\n');
                foreach (string line in totalLines) {
                string[] splitedLine = line.Split('#');
                listBox2.Items.Add(splitedLine[0]);
                listBox3.Items.Add(splitedLine[1]);
                }
    şeklinde düzenledim.


    • Düzenleyen SelimBerkay 25 Ağustos 2016 Perşembe 20:54
    25 Ağustos 2016 Perşembe 20:49
  • Ayni degiskeni iki kere tanimlayamazsin, totalText'in ikinci kullaniminda basinda string olmamali (stringler immutable oldugundan dogrudan yeni bir degisken kullanabilirsin).

    string file = Properties.Resources.düzenli;
    var items = File.ReadAllLines(file)
                .Where(line => line.Contains('#'))
                .Select(line => line.Split('#'))
                .Select( parts => new {
                   item1 = parts[0],
                   item2 = parts[1] });
    
    lstBox1.DataSource = items.Select(i => i.item1).ToList();
    lstBox2.DataSource = items.Select(i => i.item2).ToList();
    
    Tabii tek bir listeye indexiyle birlikte Tuple olarak alabillirsin ve ayni listeyi her iki listbox'in da datasource'u yapabilirsin. Ancak o zaman listbox secimleri senkronize olacaktir (birisinde 2.satiri secince digerinde de secilmesi gibi), bu istemedigin bir durum herhalde. 

    • Yanıt Olarak İşaretleyen SelimBerkay 25 Ağustos 2016 Perşembe 21:43
    25 Ağustos 2016 Perşembe 21:37
    Yanıtlayıcı