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。你这样做了吗?:)是的,现在我工作很好,得到了预期的输出。谢谢你的帮助我真的很感谢你为我所做的努力。非常感谢你,请继续这样帮助。你的帮助对像我和其他人这样的新手程序员来说意义重大:)。总是乐于助人。