从子类增加数组

时间:2019-01-23 02:47:23

标签: c#

我正在尝试为文本文件中找到的每个字符增加数组,但是当我尝试使用+1,+ =或++递增数组时,出现一条消息,提示“运算符'+ +'不适用于'CharacterFrequency'类型的操作数。”我也不能为此使用int []。

提前感谢您提供的任何指导。

string s = File.ReadAllText("wap.txt");
CharacterFrequency[] count = new CharacterFrequency[(int)char.MaxValue];

foreach (char t in s)
{

   count[t]++;
}

预期结果将是数组保留文本文件中每个唯一字符的出现。例如count[] = {A, a, B, c }

我的CharacterFrequency类:

class CharacterFrequency
{
  public int Frequency { get; set; }
  public char Char { get; set; }

public override string ToString()
{
  return $"Character: {Char} Frequency: {Frequency}";
}

3 个答案:

答案 0 :(得分:4)

很明显,您的问题是您需要添加频率参考:

count[t].Frequency++; 

但是,由于这是学术性的并且很无聊,因此您也可以使用linq完成此操作

优点,您在该文件中只有一个字符列表,并且效率仍然很高

var count = File.ReadAllText("wap.txt")
                .ToCharArray()
                .GroupBy(x => x)
                .Select(x => new CharacterFrequency() { Char = x.Key, Frequency = x.Count() })
                .ToArray();

foreach (var item in count)
   Console.WriteLine($"{item.Char} {item.Frequency}");

var dict = File.ReadAllText("wap.txt")
               .ToCharArray()
               .GroupBy(x => x)
               .ToDictionary(x => x.Key, x => x.Count());

foreach (var item in dict )
   Console.WriteLine($"{item.Key} {item.Value}");

其他资源

File.ReadAllText Method

  

打开一个文本文件,将文件中的所有文本读取为字符串,然后   然后关闭文件。

String.ToCharArray Method

  

将此实例中的字符复制到Unicode字符数组。

Enumerable.GroupBy Method

  

对序列的元素进行分组。

Enumerable.ToArray(IEnumerable) Method

  

从IEnumerable创建数组。

Enumerable.ToDictionary Method

  

从IEnumerable创建字典。

$ - string interpolation (C# Reference)

  

$特殊字符将字符串文字标识为插值   串。插值字符串是可能包含以下内容的字符串文字   插值表达式。当插值字符串解析为   结果字符串,带有插值表达式的项目将替换为   表达式结果的字符串表示形式。

答案 1 :(得分:0)

您可以简单地做到这一点:

string s = File.ReadAllText("wap.txt");
int[] count = new int[(int)char.MaxValue];

foreach (char t in s)
{
   count[t]++; // or count[(int)t] ++;
}

更新的代码:

您可以像这样声明对象的数组:

CharacterFrequency[] count = new CharacterFrequency[(int)char.MaxValue];

for (int i=0;i < count.Length; i++)
{ count[i] = new CharacterFrequency();}

然后您可以执行以下操作:

foreach (char t in s)
{
   count[t].Frequency ++;
}

最终代码。一共有128个ASCII字符:

CharacterFrequency[] count = new CharacterFrequency[128];

for (int i=0;i < count.Length; i++)
{ count[i] = new CharacterFrequency();}

foreach (char t in s)
{
    if (count[t].Char == '\0')
    {
        count[t].Char = t;
        count[t].Frequency = 1;
    }
    else count[t].Frequency++;
 }

答案 2 :(得分:0)

您需要访问并增加if(isset($check)){ $client = $_POST['client']; $project = $_POST['project']; $kit_no = $_POST['kit_no']; //array $kit_desc = $_POST['kit_desc']; //array for($i=0;$i<sizeof($check);$i++){ for($i=0;$i<sizeof($kit_no);$i++){ for($i=0;$i<sizeof($kit_desc);$i++){ $query=mysqli_query($con,"INSERT INTO tbltrainsets_kit(id, client, project, kit_no, kit_desc)VALUES( '', '".$client."', '".$project."', '".$kit_no[$i]."', '".$kit_desc[$i]."' )")or die(mysqli_error($con)); } } } } 属性:

Frequency

请注意,目前您有一个count[t].Frequency++; 值数组,因此在尝试上述代码之前,应依次初始化每个项目,否则将获得null

NullReferenceException将实例化第一项。