C# 将已排序字典转换为数组
我有一个程序,可以读取ASCII文件并输出一个文本文件,其中包含每个字符及其在文件中出现的次数。这个程序中使用了一个排序字典,但我想知道您是否可以使用数组来存储字符?代码如下: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
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的设计,它将满足要求。