2013-07-05 3 views
-6

привет всем я хочу добавить данные в тексте в элементы управления 3 списков с помощью C#добавляя каждую строку в текстовый файл в список C#

У меня есть основной дополнительный и боковой лист и ЭРВО содержимое одного из текст файлы

#main 
9622164 
90411554 
57568840 
53804307 
44095762 
89399912 
88264978 
26400609 
45725480 
53804307 
53129443 
51858306 
53797637 
91020571 
27415516 
57568840 
89185742 
20586572 
99594764 
19613556 
53797637 
75500286 
51858306 
89185742 
26400609 
90411554 
44330098 
91020571 
90411554 
47297616 
75500286 
28297833 
26400609 
27415516 
45725480 
53804307 
89399912 
89399912 
29401950 
9622164 
#extra 
79229522 
41517789 
80321197 
76774528 
44508094 
83994433 
45815891 
26593852 
74371660 
80117527 
80117527 
10389142 
10389142 
90726340 
51735257 
!side 
74530899 
74530899 
804000084 
70095154 
80344569 
24508238 
24508238 
5318639 
5318639 
15800838 
15800838 
35027493 
35027493 
54974237 
54974237 

я хочу, чтобы каждая линия под #main в основном списке в каждой строке под стороне! в списке сбоку и каждая строка под #extra в дополнительном списке, пожалуйста, помочь Thanks

вот код im с использованием atm для добавления элементов в список, но мне нужно их разделить

String text = File.ReadAllText("test.ydk"); 

    var result = Regex.Split(text, "\r\n|\r|\n"); 

    foreach (string s in result) 
    { 
     MainDeck.Items.Add(s); 
    } 
+1

[Что вы пробовали] (http://www.whathaveyoutried.com) и, в частности, то, что не работает ни с чем ты пытался? –

+0

Я попытался использовать streamreader, чтобы прочитать содержимое, но не могу заставить его работать, и я попытался найти решение, но не смог найти что-нибудь, что работает – outlaw1994

+0

«но не могу заставить его работать» ... что не получилось? Любое конкретное сообщение об ошибке, странный вывод? Нам нужен код. –

ответ

0

Предполагая, что вы уже преобразовали его в строку, вы можете использовать функцию string.split(). Это используется C#.

sting yourtextfile; 
//make all the different sections the same 
yourtextfile.replace("#main", "#"); 
yourtextfile.replace("#extra", "#"); 
yourtextfile.replace("!side", "#"); 
//make all the arrays 
string[] all = yourtextfile.Split('#'); 
string[] main = all[0].Split('\n'); 
string[] extra = all[1].Split('\n'); 
string[] side = all[2].Split('\n'); 

После этого преобразуйте массивы в списки, и у вас есть три списка, которые вы хотели.

+0

Как точно я бы добавил это в thnx – outlaw1994

+0

, не reliaze, что с! какой список представляет собой колоду карт в игре, и я пытаюсь сделать конвертер для преобразования колоды, которая является текстовым файлом выше, в удобочитаемый формат того, какие карты находятся в этой колоде – outlaw1994

0

Используйте File.ReadAllLines, чтобы получить содержание каждой строки в виде массива строк, а затем перебрать каждый элемент в списке, установив флаг, который управляет, список которых вы (повторно) добавить каждый элемент в. Это не самый эффективный, так как вам приходится обрабатывать каждую строку дважды, но это очень чисто и легко понять.

1

Очень трудно обыграть метод File.ReadLined, который делает именно это - считывает все строки из файла.

Чем вы можете перебирать и делиться так, как вам нужно. Foreach с переносом последнего увиденного имени над всеми предметами - разумный подход.

Используя Aggregate при необходимости можно дать какие-либо инструкции по утверждению. Образец для модной версии, которая использует неизменяемые Tuple для передачи значений между шагами и использования IEnumerable для хранения предметов. Почти функционально чистый код (за исключением TryParse, как нет подходящей версии существует в Framework):

int value; 
var dictionaryOfNumberByName = File.ReadLines(@"c:\myFile.txt") 
    .Aggregate(
    Tuple.Create("unknown", Enumerable.Repeat(Tuple.Create("", 0), 0)), 
    (all, line) => int.TryParse(line, out value) ? 
      Tuple.Create(
      all.Item1, 
      all.Item2.Concat(Enumerable.Repeat(Tuple.Create(all.Item1, value),1))) : 
      Tuple.Create(line, all.Item2), 
    all => all.Item2 
     .GroupBy(
      item => item.Item1, 
      (key, source) => Tuple.Create(key, source.Select(v => v.Item2).ToList())) 
     .ToDictionary(item => item.Item1, item => item.Item2)); 

Нормальный код должен просто агрегатные элементы в изменяемый словарь непосредственно.

var dictionaryOfNumberByName = File.ReadLines(@"c:\myFile.txt") 
    .Aggregate(Tuple.Create("unknown", new Dictionary<string, List<int>>()), 
    (all, line) => { 
     int value; 
     if(!int.TryParse(line, out value)) 
     { 
      all.Item2.Add(line, new List<int>()); 
      return Tuple.Create(line, all.Item2); // switch current word 
     } 
     else 
     { 
     all.Item2[all.Item1].Add(value); 
     return all; 
     } 
}); 
+0

+1, я забыл про 'Агрегат', намного лучше, чем мой глупый. Пропустить/принять ответ –

+0

@ sa_ddam213 - Агрегат - это одна строка, но может считаться безумной и не очень эффективной, если не использовать изменяемые типы. Вы легко поняли решение (не очень оптимальное, но простое, чтобы доказать работоспособность) ... –

2

Вы можете использовать LinqSkip и Take на линии, если вы читаете текстовый файл, используя File.ReadAllLines

Пример:

// Read all the lines from the text file 
var textLines = File.ReadAllLines("c:\\stackoverflow.txt"); 

// Skip first line `#main` and take all lines until `"#extra` 
var mainItems = textLines.Skip(1).TakeWhile(x => !x.Equals("#extra")); 

// Skip items before `#extra`, and take all before `!side` 
var extraItems = textLines.SkipWhile(x => !x.Equals("#extra")).Skip(1).TakeWhile(x => !x.Equals("!side")); 

// Skip items before `!side` and take the rest 
var sideItems = textLines.SkipWhile(x => !x.Equals("!side")).Skip(1); 

Я бы не рекомендовал это для больших текстовых файлов, но и для ваш пример с надписью, это должно быть хорошо.

0

При этом вы можете иметь одну коллекцию с отделенной все значения:

Dictionary<string, List<string>> results = new Dictionary<string, List<string>>(); 
string line; 
int count = -1; 
using (var reader = File.OpenText(@"C:\Users\Jose\Desktop\bla.txt")) 
{ 
     while ((line = reader.ReadLine()) != null) 
     { 
      if (!Regex.IsMatch(line, @"\d")) 
      { 
       results.Add(line, new List<string>()); 
       count++; 
      } 
      else 
      { 
       results.ElementAt(count).Value.Add(line); 
      } 
     } 

} 
Смежные вопросы