C# 将已排序字典转换为数组

C# 将已排序字典转换为数组,c#,arrays,visual-studio,sorteddictionary,C#,Arrays,Visual Studio,Sorteddictionary,我有一个程序,可以读取ASCII文件并输出一个文本文件,其中包含每个字符及其在文件中出现的次数。这个程序中使用了一个排序字典,但我想知道您是否可以使用数组来存储字符?代码如下: using System; using System.Linq; using System.Collections.Generic; using System.Threading.Tasks; using System.IO; using System.Text; using System.Reflection; na

我有一个程序,可以读取ASCII文件并输出一个文本文件,其中包含每个字符及其在文件中出现的次数。这个程序中使用了一个排序字典,但我想知道您是否可以使用数组来存储字符?代码如下:

using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.IO;
using System.Text;
using System.Reflection;

namespace ASCII
{
    class CharacterFrequency
    {
        private char ch;
        private int frequency;

        public char Ch
        {
            get { return ch; }
            set { ch = value; }
        }
        public int Frequency
        {
            get { return frequency; }
            set { frequency = value; }
        }


    }

    class Program
    {
        public string InputFileName = "";
        public string OutputFileName = "output.txt";
        public string FilePath = "";

        public static SortedDictionary<char, ulong> Count(string stringToCount)
        {
            SortedDictionary<char, ulong> characterCount = new SortedDictionary<char, ulong>();


            foreach (var character in stringToCount)
            {
                if (!characterCount.ContainsKey(character)) // added character to dictionary if only character is absent in charactercount
                {
                    characterCount.Add(character, 1);
                }
                else
                {
                    characterCount[character]++; // increemetned count
                }
            }
            return characterCount;
        }

        static void Main(string[] args)
        {
            var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            var inputFileName = Path.Combine(filePath, args[0]);
            var outputFileName = Path.Combine(filePath, args[1]);

            // read data, count chars
            var count = Count(File.ReadAllText(inputFileName));

            // create output content
            var outPut = count.Select(x => $"{x.Key}\t{x.Value}");

            // write it to the output file
            File.WriteAllLines(outputFileName, outPut);

        }
    }
    }
使用系统;
使用System.Linq;
使用System.Collections.Generic;
使用System.Threading.Tasks;
使用System.IO;
使用系统文本;
运用系统反思;
名称空间ASCII
{
类特征频率
{
私家车;
专用整数频率;
公共字符
{
获取{return ch;}
设置{ch=value;}
}
公共整数频率
{
获取{返回频率;}
设置{frequency=value;}
}
}
班级计划
{
公共字符串InputFileName=“”;
公共字符串OutputFileName=“output.txt”;
公共字符串FilePath=“”;
公共静态SortedDictionary计数(字符串stringToCount)
{
SortedDictionary characterCount=新的SortedDictionary();
foreach(stringToCount中的var字符)
{
if(!characterCount.ContainsKey(character))//如果characterCount中只缺少字符,则将字符添加到字典中
{
characterCount.Add(字符,1);
}
其他的
{
characterCount[字符]++;//递增计数
}
}
返回字符计数;
}
静态void Main(字符串[]参数)
{
var filePath=Path.GetDirectoryName(Assembly.getExecutionGassembly().Location);
var inputFileName=Path.Combine(filePath,args[0]);
var outputFileName=Path.Combine(filePath,args[1]);
//读取数据,计数字符
var count=count(File.ReadAllText(inputFileName));
//创建输出内容
var outPut=count.Select(x=>$“{x.Key}\t{x.Value}”);
//将其写入输出文件
writeAllines(outputFileName,outPut);
}
}
}
在program类中,是排序字典所在的位置。有没有办法用数组代替排序字典?什么代码最适合这样做


谢谢你的帮助

是的,如果是ASCII码,它甚至会比使用字典运行得更快,而不会显著增加内存使用;只需使用
ulong[127]
数组,并使用字符的值对其进行索引:

public static ulong[] Count(string stringToCount)
{
    var counter = new ulong[127];

    foreach (var character in stringToCount)
    {
        counter[(int)character] += 1;
    }

    return counter;
}
如果只需要处理可打印的ASCII字符(值32以上),则可以将数组缩小,并使用偏移量32对其进行索引:

public static ulong[] CountPrintable(string stringToCount)
{
    var counter = new ulong[95];

    foreach (var character in stringToCount)
    {
        var charValue = (int)character;

        if (charValue > 31)
        {
           counter[charValue - 32] +=1;
        }
    }

    return counter;
}
然后再次偏移以将其打印出来:

counter.Select((x, i) => $"{(char)(i + 32)}\t{counter[i]}");

你的问题是什么?你使用字典有什么问题?字典是键值对的集合。因此,键值对也可以填充到数组/列表中。您也可以将键或值放入数组/列表中。需要注意的是,数组具有固定大小和固定数量的元素。然而,当你从列表中添加或删除元素时,列表可能会增长或收缩(用数组做类似的事情会相当麻烦)。对于这个项目,我应该使用数组,而不是使用排序字典(值也不应该排序)所以我想知道是否有一种方法可以将值存储在数组中。NET文本数据类型不使用ASCII。(你知道的,对吧?
String wink=“我得到的索引超出了第42行和第55行的数组错误范围。有没有办法解决这个问题?@Zane,你说第42行和第55行?等一下,让我看看它们…;-b我想假设文本文件包含制表符(或类似字符)是比较安全的),甚至可能与您在问题中所写的相反,您的文本文件不是(纯)ASCII文件(换句话说,您的文本文件可能包含非ASCII字符)。只需使用
Char.MaxValue+1
并删除所有幻数和偏移量计算。所需的只是一条注释,说明程序计算UTF-16代码单位,如果输入仅限于ASCII,则通过Unicode和UTF-16的设计,它将满足要求。