-6

大家好,我想使用 c# 将文本中的数据添加到 3 个列表控件中

我有一个主要的额外和侧面列表,以及其中一个文本文件的内容

#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下的每一行侧列表中的每一行!side下的每一行以及额外列表中#extra下的每一行请帮助谢谢

这是我使用 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);
    }
4

5 回答 5

2

如果您使用阅读文本文件,则可以使用Linq SkipTakeFile.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);

对于大型文本文件,我不建议这样做,但对于您提供的示例,它应该没问题。

于 2013-07-05T00:23:08.470 回答
1

很难击败这样做的File.ReadLined方法 - 从文件中读取所有行。

比您可以以任何您需要的方式迭代和拆分。Foreach在所有项目上加上最后一次看到的名字是合理的方法。

Aggregate如有必要,使用可以给出一个语句解决方案。花式版本的示例,它使用不可变Tuple在步骤之间传递值并IEnumerable用于存储项目。几乎功能上干净的代码(除非TryParse框架中不存在合适的版本):

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;
      }
}); 
于 2013-07-05T00:20:59.963 回答
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);
           }
       }

}
于 2013-07-05T03:10:18.403 回答
0

用于File.ReadAllLines获取字符串数组中每一行的内容,然后遍历列表中的每个项目,设置一个标志来控制您(重新)将每个项目添加到哪个列表。这不是最有效的,因为您必须处理每行两次,但它非常干净且易于理解。

于 2013-07-05T00:20:34.793 回答
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');

之后,将数组转换为列表,您就拥有了所需的三个列表。

于 2013-07-05T00:28:12.903 回答