将数组数据添加到已排序列表中

时间:2013-03-16 23:52:40

标签: c# sortedlist

我正在尝试找到一种可以将提取的数据列表扩展到排序列表的方法?这是我下面的代码,它根据每个候选人水平显示结果,但是我看到我如何将其合并到SortedList中,我可以在该区域进行排序?

我在排序列表中尝试了一些变体,但我唯一的成功就是垂直打印出第一列(仅限)。

X 012

X 075

X 050

X 040

string[] voting = { "X012033001140", "C075100026080", "A050070060100", "Q040088050090" };
//int length = voting.Length;
int starter = 0;

int total_a = 0;
int total_b = 0;
int total_c = 0;
int total_d = 0;

int precinct_x = 0;

Console.WriteLine("VOTING RESULTS");
Console.WriteLine("--------------------");

Console.WriteLine("Precinct\tCandidate A \tCandidate B\tCandidate C\tCandidate D\tTotal Precinct Votes");

while (starter < voting.Length)
{
    string precinct = voting[starter].Substring(0, 1);
    string cand_a = voting[starter].Substring(1, 3);
    string cand_b = voting[starter].Substring(4, 3);
    string cand_c = voting[starter].Substring(7, 3);
    string cand_d = voting[starter].Substring(10, 3);
    int counter = 0;

    //Converting the vote counts from strings to ints in order to calculate
    int a = Convert.ToInt32(cand_a);
    int b = Convert.ToInt32(cand_b);
    int c = Convert.ToInt32(cand_c);
    int d = Convert.ToInt32(cand_d);

    precinct_x = a + b + c + d;
    counter++;

    //Console.WriteLine(precinct);
    Console.WriteLine(precinct + "\t\t" + cand_a + "\t\t" + cand_b + "\t\t" + cand_c + "\t\t" + cand_d + "\t\t" + precinct_x + "\t");

    double precinct_total = Convert.ToDouble(precinct_x);

    //This is required in order to continuously loop up to the maximum of the voting Length
    starter = starter + 1;

    //Calculations for Candidate A
    total_a = total_a + a;

    total_b = total_b + b;
    total_c = total_c + c;
    total_d = total_d + d;

}
Console.WriteLine("\nTOTAL RESULTS");
Console.WriteLine("--------------------------------------------------------------------------------");
Console.WriteLine("\t\t" + total_a + "\t\t" + total_b + "\t\t" + total_c + "\t\t" + total_d);

Console.ReadLine();

1 个答案:

答案 0 :(得分:0)

首先,您需要创建一个可以保存要排序的数据的类

public class VotingResult
{
    public VotingResult(int numberOfCandidates)
    {
        Candidates = new int[numberOfCandidates];
    }

    public string Precinct { get; set; }
    public int[] Candidates { get; private set; }
    public int PrecinctTotal { get { return Candidates.Sum(); } }
}

然后填写一份清单

const int NumberOfCandidates = 4;
var votingResults = new List<VotingResult>();
foreach (string s in voting) {
    votingResult = new VotingResult(NumberOfCandidates);
    votingResult.Precinct = s.Substring(0, 1);
    for (int cand = 0; cand < NumberOfCandidates; cand++) {
        votingResult.Candidates[cand] = Convert.ToInt32(s.Substring(3 * cand + 1, 3));
    }
    votingResults.Add(votingResult);
}

现在您可以对列表进行排序

var sortedResults = votingResults.OrderBy(v => v.Precinct);

// Or, depending on what you want to sort

var sortedResults = votingResults.OrderByDescending(v => v.PrecinctTotal);

现在你可以打印

var totals = new int[NumberOfCandidates];
foreach (VotingResult v in sortedResults) {
    Console.WriteL(v.Precinct + "\t\t");
    for (int cand = 0; cand < NumberOfCandidates; cand++) {
        Console.Write(v.Candidates[cand]  + "\t\t");
        total[cand] += v.Candidates[cand];
    }
    Console.WriteLine(v.PrecinctTotal);
}
Console.WriteLine("\nTOTAL RESULTS\t\t");
for (int cand = 0; cand < NumberOfCandidates; cand++) {
     Console.Write(totals[cand]  + "\t\t");
}
Console.WriteLine();

不要忘记代码顶部的这一行,因为我们使用LINQ进行排序和求和。

using System.Linq;

您还可以使用SortedList原因。如果您需要多次访问已排序的结果,或者您想要在列表中添加其他条目,并且希望列表始终进行排序,而不仅仅是在结尾,则这是一个优势。

var sortedList = new SortedList<string, VotingResult>();

...
sortedList.Add(votingResult.Precinct, votingResult);
...

或者,如果您想按行降序排序

var sortedList = new SortedList<int, VotingResult>();

...
sortedList.Add(-votingResult.PrecinctTotal, votingResult);
...

其余部分保持不变,除了您可以删除排序部分,您必须遍历sortedList.Values


有很多方法可以做到这一点,但无论如何,为列表条目创建一个类是有利的,因为它允许您将所有数据保存在一起。