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"));
        }

好了,测试通过了,你可以随心所欲地重构,因为你知道你不会破坏实际的逻辑。