大家好我想用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);
}
答案 0 :(得分:2)
如果您使用Linq
Skip
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);
对于大型文本文件,我不会推荐这个,但是对于你提供的示例,它应该没问题。
答案 1 :(得分: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;
}
});
答案 2 :(得分:0)
使用File.ReadAllLines
获取字符串数组中每一行的内容,然后遍历列表中的每个项目,设置一个标志,控制您(重新)添加每个项目的列表。它不是最有效的,因为你必须处理每一行两次,但它非常干净且易于理解。
答案 3 :(得分: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');
然后,将数组转换为列表,并且您拥有所需的三个列表。
答案 4 :(得分: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);
}
}
}