C# 如何计算存储在包含多个Delimeter的文件中的数字的出现次数?
这是我在文件中的输入存储:C# 如何计算存储在包含多个Delimeter的文件中的数字的出现次数?,c#,regex,linq,file,collections,C#,Regex,Linq,File,Collections,这是我在文件中的输入存储: 50|Carbon|Mercury|P:4;P:00;P:1 90|Oxygen|Mars|P:10;P:4;P:00 90|Serium|Jupiter|P:4;P:16;P:10 85|Hydrogen|Saturn|P:00;P:10;P:4 现在我将取我的第一行p:4,然后取下一行p:00,然后取下一行like wise,并希望每隔一行计算发生次数,因此预期输出将为: p:43(位于第二行、第三行、第四行(最后一个单元格)) p:002(位于第二排、第四排)
50|Carbon|Mercury|P:4;P:00;P:1
90|Oxygen|Mars|P:10;P:4;P:00
90|Serium|Jupiter|P:4;P:16;P:10
85|Hydrogen|Saturn|P:00;P:10;P:4
现在我将取我的第一行p:4,然后取下一行p:00,然后取下一行like wise,并希望每隔一行计算发生次数,因此预期输出将为:
p:43(位于第二行、第三行、第四行(最后一个单元格))
p:002(位于第二排、第四排)
p:10(没有发生此类事件)
p:101
p:160
等
像wise一样,我想打印每个比例的发生率
到目前为止,我成功地逐行拆分并存储在我的类文件对象中,如下所示:
public class Planets
{
//My rest fields
public string ProportionConcat { get; set; }
public List<proportion> proportion { get; set; }
}
public class proportion
{
public int Number { get; set; }
}
List<Planets> Planets = new List<Planets>();
Planets[0]:
{
Number:50
name: Carbon
object:Mercury
ProportionConcat:P:4;P:00;P:1
proportion[0]:
{
Number:4
},
proportion[1]:
{
Number:00
},
proportion[2]:
{
Number:1
}
}
公共类行星
{
//我的休息地
公共字符串比例concat{get;set;}
公共列表比例{get;set;}
}
公共阶层比例
{
公共整数{get;set;}
}
我已经像下面那样填写了我的行星对象,最后我的行星对象数据列表如下:
public class Planets
{
//My rest fields
public string ProportionConcat { get; set; }
public List<proportion> proportion { get; set; }
}
public class proportion
{
public int Number { get; set; }
}
List<Planets> Planets = new List<Planets>();
Planets[0]:
{
Number:50
name: Carbon
object:Mercury
ProportionConcat:P:4;P:00;P:1
proportion[0]:
{
Number:4
},
proportion[1]:
{
Number:00
},
proportion[2]:
{
Number:1
}
}
List行星=新列表();
行星[0]:
{
电话:50
名称:碳纤维
对象:汞
比例浓度:P:4;P:00;P:1
比例[0]:
{
电话:4
},
比例[1]:
{
电话:00
},
比例[2]:
{
编号:1
}
}
等…
我知道我可以循环并执行搜索和计数,但是需要2到3个循环,代码会有点混乱,所以我需要一些更好的代码来执行
现在,我如何在我的行星列表对象中搜索每一个并计算每一个其他比例???您可以使用
var count=Regex.Matches(lineString,input).count代码>。试试这个例子
var list = new List<string>
{
"50|Carbon|Mercury|P:4;P:00;P:1",
"90|Oxygen|Mars|P:10;P:4;P:00",
"90|Serium|Jupiter|P:4;P:16;P:10",
"85|Hydrogen|Saturn|P:00;P:10;P:4"
};
int totalCount;
var result = CountWords(list, "P:4", out totalCount);
Console.WriteLine("Total Found: {0}", totalCount);
foreach (var foundWords in result)
{
Console.WriteLine(foundWords);
}
public class FoundWords
{
public string LineNumber { get; set; }
public int Found { get; set; }
}
private List<FoundWords> CountWords(List<string> words, string input, out int total)
{
total = 0;
int[] index = {0};
var result = new List<FoundWords>();
foreach (var f in words.Select(word => new FoundWords {Found = Regex.Matches(word, input).Count, LineNumber = "Line Number: " + index[0] + 1}))
{
result.Add(f);
total += f.Found;
index[0]++;
}
return result;
}
var list=新列表
{
“50 |碳|汞| P:4;P:00;P:1”,
“90 |氧|火星| P:10;P:4;P:00”,
“90 | Serium | Jupiter | P:4;P:16;P:10”,
“85 |氢|土星| P:00;P:10;P:4”
};
整数总数;
var结果=CountWords(列表“P:4”,超出totalCount);
WriteLine(“找到的总数:{0}”,totalCount);
foreach(结果中的单词)
{
Console.WriteLine(foundWords);
}
公共类词汇
{
公共字符串行号{get;set;}
找到公共int{get;set;}
}
私有列表CountWords(列表单词、字符串输入、out int总计)
{
总数=0;
int[]索引={0};
var result=新列表();
foreach(words.Select(word=>newfoundwords{Found=Regex.Matches(word,input.Count),LineNumber=“行号:”+index[0]+1}))
{
结果:添加(f);
总数+=已发现的f;
索引[0]++;
}
返回结果;
}
如果您已经解析了比例,您可以为输出数据创建新的结构:
// Class to storage result
public class Values
{
public int Count; // count of proportion entry.
public readonly HashSet<int> Rows = new HashSet<int>(); //list with rows numbers.
/// <summary> Add new proportion</summary>
/// <param name="rowNumber">Number of row, where proportion entries</param>
public void Increment(int rowNumber)
{
++Count; // increase count of proportions entries
Rows.Add(rowNumber); // add number of row, where proportion entry
}
}
//类到存储结果
公共阶级价值观
{
public int Count;//比例项的计数。
public readonly HashSet Rows=new HashSet();//列出行数。
///增加新的比例
///行数,其中包含比例条目
公共无效增量(整数行数)
{
++Count;//增加比例项的计数
Rows.Add(rowNumber);//添加行数,其中比例项
}
}
然后用这个代码来填充它。我不确定它是否“凌乱”,也不认为有必要用LINQ使代码复杂化。你觉得怎么样
var result = new Dictionary<int, Values>(); // create dictionary, where we will storage our results. keys is proportion. values - information about how often this proportion entries and rows, where this proportion entry
for (var i = 0; i < Planets.Count; i++) // we use for instead of foreach for finding row number. i == row number
{
var planet = Planets[i];
foreach (var proportion in planet.proportion)
{
if (!result.ContainsKey(proportion.Number)) // if our result dictionary doesn't contain proportion
result.Add(proportion.Number, new Values()); // we add it to dictionary and initialize our result class for this proportion
result[proportion.Number].Increment(i); // increment count of entries and add row number
}
}
var result=new Dictionary();//创建字典,我们将在其中存储结果。关键是比例。值-有关此比例条目和行的频率以及此比例条目的位置的信息
for(var i=0;i
我在这里为您制作了一个DotNetFiddle:
基本上,您可以使用.Split
一次拆分多个分隔符,这非常简单。之后,一切都是肉汁:)
显然,我的代码只是将结果输出到控制台,但这一部分很容易更改。如果您有什么不明白的地方,请告诉我。这里看起来像个家work@un-lucky:如果你也能给我一些想法,那也没问题。我会写逻辑,但会很混乱,所以如果我能得到更好的逻辑,我就能学习,所以我在这里问你能提供你做过的代码吗?因此,我们可以进行一些重构和优化。@ArtemKulikov:事实上,我也在考虑这一点,并且尝试过一次,如果我达到某个点,我会用code@Learning你能具体说明一下吗。您需要预期输出
或填写您的行星
结构?此行出错:结果[比例.Number]。增量(i);对象引用未设置为对象的实例。错误:public readonly HashSet Rows=new HashSet();在我的结构中不能有实例字段初始值设定项,但有一个错误,我在前面的评论中告诉过你。好吧,我在行中添加了initializator
字段。因为struct不支持它-我将struct改为class。你这样做了吗?:)是的,现在我工作很好,得到了预期的输出。谢谢你的帮助我真的很感谢你为我所做的努力。非常感谢你,请继续这样帮助。你的帮助对像我和其他人这样的新手程序员来说意义重大:)。总是乐于助人。