C# 多变量排行榜
C# multiple variable leaderboard
我正在用 C# 编写脚本,它需要一个使用多个参数创建排行榜的函数。
这是其中一个排行榜的示例:
粗体栏是排行榜的第一个检查,然后它移动到左侧的栏,依此类推。
我的想法是为每一列创建一个 for 循环并对四个值进行排序。
int[] tempScores = new int[scores[0].Length];
for (int i = 0; i < scores[0].Length; i++)
{
if (scores[0][i] < scores[0][i+1]) tempScores[i] = scores[0][i+1];
else if (scores[0][i] > scores[0][i+1]) tempScores[i] = scores[0][i];
else if (scores[0][i] == scores[0][i+1])
{
// Do same thing but for next column : scores[1]
}
}
这段代码在 90% 的时间都能正常工作,但有时两个或更多的值会被反转。它不适用于这样的排行榜:
因此,如果有人对我的问题有答案或更有效的方法,我很想知道如何做。
我读到这里,第一个想到的就是 Linq。您需要做的就是按您关心的第一个 属性 排序,然后按所有其他排序。
首先是创建一个 class 可以保存您的国家/地区数据。
它可能看起来像这样:
public class CountryData
{
public string Name { get; set; }
public int Prop1 { get; set; }
public int Prop2 { get; set; }
public int Prop3 { get; set; }
public int Prop4 { get; set; }
public int Prop5 { get; set; }
public int Prop6 { get; set; }
public int Prop7 { get; set; }
public int Prop8 { get; set; }
}
我不知道这些属性是什么意思,因为你没有说,所以我暂时给了它们一个通用名称。您可以随时将其更改为更有意义的内容
好的,现在我们有了这个,我们需要实际排序。
我们可以写另一个 class 来做到这一点 :
public class OrderLogic
{
public List<CountryData> SortCountries(List<CountryData> countriesData)
{
return countriesData
.OrderByDescending(p => p.Prop8)
.ThenByDescending(p => p.Prop7) //continue with as many orders as you need
.ToList();
}
}
最后,我们如何使用它?
我会为此编写一个测试,以确保逻辑运行良好:
[Test]
public void Test1()
{
List<CountryData> countriesData = new List<CountryData>();
countriesData.Add(new CountryData { Name = "Switzerland", Prop1 = 3, Prop2 = 1, Prop3 = 1, Prop4 = 1, Prop5 = 4, Prop6 = 5, Prop7 = -1, Prop8 = 4 });
countriesData.Add(new CountryData { Name = "Italy", Prop1 = 3, Prop2 = 3, Prop3 = 0, Prop4 = 0, Prop5 = 7, Prop6 = 0, Prop7 = 7, Prop8 = 9 });
countriesData.Add(new CountryData { Name = "Wales", Prop1 = 3, Prop2 = 1, Prop3 = 1, Prop4 = 1, Prop5 = 3, Prop6 = 2, Prop7 = 1, Prop8 = 4 });
countriesData.Add(new CountryData { Name = "Turkey", Prop1 = 3, Prop2 = 0, Prop3 = 0, Prop4 = 3, Prop5 = 1, Prop6 = 8, Prop7 = -7, Prop8 = 0 });
var result = new OrderLogic().SortCountries(countriesData);
Assert.IsTrue(result[0].Name.Equals("Italy"));
Assert.IsTrue(result[1].Name.Equals("Wales"));
Assert.IsTrue(result[2].Name.Equals("Switzerland"));
Assert.IsTrue(result[3].Name.Equals("Turkey"));
}
好了,测试通过了,你可以随心所欲地重构,因为你知道你不会破坏实际的逻辑。
我正在用 C# 编写脚本,它需要一个使用多个参数创建排行榜的函数。
这是其中一个排行榜的示例:
粗体栏是排行榜的第一个检查,然后它移动到左侧的栏,依此类推。
我的想法是为每一列创建一个 for 循环并对四个值进行排序。
int[] tempScores = new int[scores[0].Length];
for (int i = 0; i < scores[0].Length; i++)
{
if (scores[0][i] < scores[0][i+1]) tempScores[i] = scores[0][i+1];
else if (scores[0][i] > scores[0][i+1]) tempScores[i] = scores[0][i];
else if (scores[0][i] == scores[0][i+1])
{
// Do same thing but for next column : scores[1]
}
}
这段代码在 90% 的时间都能正常工作,但有时两个或更多的值会被反转。它不适用于这样的排行榜:
因此,如果有人对我的问题有答案或更有效的方法,我很想知道如何做。
我读到这里,第一个想到的就是 Linq。您需要做的就是按您关心的第一个 属性 排序,然后按所有其他排序。
首先是创建一个 class 可以保存您的国家/地区数据。
它可能看起来像这样:
public class CountryData
{
public string Name { get; set; }
public int Prop1 { get; set; }
public int Prop2 { get; set; }
public int Prop3 { get; set; }
public int Prop4 { get; set; }
public int Prop5 { get; set; }
public int Prop6 { get; set; }
public int Prop7 { get; set; }
public int Prop8 { get; set; }
}
我不知道这些属性是什么意思,因为你没有说,所以我暂时给了它们一个通用名称。您可以随时将其更改为更有意义的内容
好的,现在我们有了这个,我们需要实际排序。
我们可以写另一个 class 来做到这一点 :
public class OrderLogic
{
public List<CountryData> SortCountries(List<CountryData> countriesData)
{
return countriesData
.OrderByDescending(p => p.Prop8)
.ThenByDescending(p => p.Prop7) //continue with as many orders as you need
.ToList();
}
}
最后,我们如何使用它?
我会为此编写一个测试,以确保逻辑运行良好:
[Test]
public void Test1()
{
List<CountryData> countriesData = new List<CountryData>();
countriesData.Add(new CountryData { Name = "Switzerland", Prop1 = 3, Prop2 = 1, Prop3 = 1, Prop4 = 1, Prop5 = 4, Prop6 = 5, Prop7 = -1, Prop8 = 4 });
countriesData.Add(new CountryData { Name = "Italy", Prop1 = 3, Prop2 = 3, Prop3 = 0, Prop4 = 0, Prop5 = 7, Prop6 = 0, Prop7 = 7, Prop8 = 9 });
countriesData.Add(new CountryData { Name = "Wales", Prop1 = 3, Prop2 = 1, Prop3 = 1, Prop4 = 1, Prop5 = 3, Prop6 = 2, Prop7 = 1, Prop8 = 4 });
countriesData.Add(new CountryData { Name = "Turkey", Prop1 = 3, Prop2 = 0, Prop3 = 0, Prop4 = 3, Prop5 = 1, Prop6 = 8, Prop7 = -7, Prop8 = 0 });
var result = new OrderLogic().SortCountries(countriesData);
Assert.IsTrue(result[0].Name.Equals("Italy"));
Assert.IsTrue(result[1].Name.Equals("Wales"));
Assert.IsTrue(result[2].Name.Equals("Switzerland"));
Assert.IsTrue(result[3].Name.Equals("Turkey"));
}
好了,测试通过了,你可以随心所欲地重构,因为你知道你不会破坏实际的逻辑。