首页 > 解决方案 > C# 替代嵌套有序字典?

问题描述

我正在开发的程序有问题。该程序的基本本质是查看选举数据文件并通过嵌套对象组织它。例如,每个政治种族都是一个对象,每个政治种族对象都有一个候选人和县结果对象的列表,等等。

我当前的问题围绕前面提到的县结果对象展开。我应该遍历文件,并记录候选人的姓名和他们在每个县获得的票数。目前我正在使用嵌套的有序字典来实现这一点,但它看起来很笨重,而且我在访问它们时遇到了问题。到目前为止,这是我的代码(listOrdicRows 是读取到有序列表中的选举文本文件):

public CountyResults(List<OrderedDictionary> listOrdicRows, String raceCode)
{
    foreach (OrderedDictionary row in listOrdicRows)
    {
        bool duplicate = false;
        foreach (County indivCounty in CountyList)
        {
            if (indivCounty.countyName == row["county_name"].ToString() && raceCode == row["race_code"].ToString())
            {
                duplicate = true;
                break;                            
            }
        }
        if (!duplicate && raceCode == row["race_code"].ToString())
        {
            CountyList.Add(new County(row["county_code"].ToString(), row["county_name"].ToString(), row["precincts"].ToString(), row["precincts_reporting"].ToString()));
        }
    }
    populateCountyDict(listOrdicRows);          
}

public void populateCountyDict(List<OrderedDictionary> listOrdicRows) //Dynamically populates County Dictionary
{
    foreach (County x in CountyList)
    {
        String CountyName = x.countyName;
        List<OrderedDictionary> candidatesWithVotes = null;
        foreach (OrderedDictionary row in listOrdicRows)
        {
            if (CountyName == row["county_name"].ToString())
            {
                OrderedDictionary tempDictionary = new OrderedDictionary();
                tempDictionary.Add(row["candidate_name"], row["total_votes"]);
                candidatesWithVotes.Add(tempDictionary);
            }
        }
        countyDict.Add(CountyName, candidatesWithVotes);
    }
}

任何帮助将不胜感激,因为我非常卡住。有人问文件是什么样子的,这里有几行

选举日期 | 派对代码 | 派对名称 | 比赛代码 | 办公描述 | 县代码 | 县名 | 法学 | 法理学 | 选区 | 区域报告 | CanNameLast | CanNameFirst | CanNameMiddle | 可以投票
------------ | --------- | ---------- | -------- | ---------------------------------------- | ---------- | ---------- | --------- | --------- | --------- | ------------------ | ------------ | ------------ | ------------- | --------
2020/08/18 | 代表 | 共和党 | 苏联 | 美国代表 | 电调 | 埃斯坎比亚 | 001 | | 0 | 0 | 盖茨 | 马特 | | 29272   
2020/08/18 | 代表 | 共和党 | 苏联 | 美国代表 | 霍尔 | 福尔摩斯 | 001 | | 6 | 6 | 盖茨 | 马特 | | 2131    
2020/08/18 | 代表 | 共和党 | 苏联 | 美国代表 | 冈 | 奥卡卢萨 | 001 | | 52 | 52 | 盖茨 | 马特 | | 25861   

标签: c#filedictionary

解决方案


Linq 可以使它变得简单易读。

我已经为几列创建了一个示例文件

在此处输入图像描述

接下来是代码

   public class ElectionInfo
    {
        public string Race { get; set; }
        public string County { get; set; }
        public string FName { get; set; }
        public int VoteCnt { get; set; }
    }

    static void Main(string[] args)
    {
        Dictionary<string, List<ElectionInfo>> dict1 = File.ReadAllLines(@"C:\x1\TextFile2.txt")
        .Select(record => record.Split(','))
        .Select(cell => new ElectionInfo() { Race = cell[0], County = cell[1], FName = cell[2], VoteCnt = int.Parse(cell[3]) })
        .GroupBy(x => x.Race)
        .ToDictionary(t => t.Key, t => t.ToList<ElectionInfo>())
        ;

推荐阅读