我正在尝试找到一种可以将提取的数据列表扩展到排序列表的方法?这是我下面的代码,它根据每个候选人水平显示结果,但是我看到我如何将其合并到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();
答案 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
。
有很多方法可以做到这一点,但无论如何,为列表条目创建一个类是有利的,因为它允许您将所有数据保存在一起。