C# 在没有数组的情况下排序多维数组。排序还是数据网格?

C# 在没有数组的情况下排序多维数组。排序还是数据网格?,c#,winforms,C#,Winforms,我创建了这个for循环,这样当我单击一个按钮时,我可以查看同学们的成绩,如下所示: Name Test Basket Destructive Final Grade Alex 10 10 10 10 Danny 20 20 20 20 Dave 35 40 50 40 Goerge 0 0 0

我创建了这个for循环,这样当我单击一个按钮时,我可以查看同学们的成绩,如下所示:

Name    Test    Basket  Destructive   Final Grade
Alex    10      10      10            10
Danny   20      20      20            20
Dave    35      40      50            40
Goerge  0       0       0             0
Hannan  0       0       0             0
Ian     0       0       0             0
Muna    0       0       0             0
下面是它的代码:

private void uiShowMarksAZButton_Click(object sender, EventArgs e)
{         
    uiMarksDisplayTextBox.Text = string.Join("\t", Columns);
    uiMarksDisplayTextBox.Text += System.Environment.NewLine;

    for (int i = 0; i < Names.Length; i++)
    {
        uiMarksDisplayTextBox.Text += Names[i];
        for (int x = 0; x < 3; x++)
        {
            uiMarksDisplayTextBox.Text += "\t" + Grade[i, x];
        }
        uiMarksDisplayTextBox.Text += "\t" + "\t" + FinalGrade[i];
        uiMarksDisplayTextBox.Text += System.Environment.NewLine;
    }
}

对于目前的问题,这里有一个高级算法:

首先确保所有数组的长度相同

然后应用你最喜欢的排序算法(我建议初学者使用冒泡排序。最差的排序算法,但最容易学习)

无论何时交换FinalGrade数组中的元素,都会交换相同索引的其他数组中的元素

例如,如果您在FinalGrade中交换了索引1和索引3,那么您还将交换所有其他数组的元素1和3


我将把实际的编码留作练习。

我认为你不能只循环一次。您可以尝试一些如下的递归逻辑来保持循环,直到所有事情都排序

private List<YourObject> Sort(FinalGrade){
   bool finished = true; 
        for (int x = 0; x < FinalGrade.Length; x++)
            {
                for (int j = x + 1; j < FinalGrade.Length; j++)
                {
                    if (FinalGrade[x] > FinalGrade[j])
                    {
                        temp = FinalGrade[j];
                        FinalGrade[j] = FinalGrade[x];
                        FinalGrade[x] = temp;
                        finished = false;
                    }                      
                }
            }

   return finished? FinalGrade : Sort(FinalGrade)
}
私有列表排序(FinalGrade){
bool finished=true;
对于(int x=0;x最终等级[j])
{
温度=最终等级[j];
最终等级[j]=最终等级[x];
最终等级[x]=温度;
完成=错误;
}                      
}
}
返回完成?最终版本:排序(最终版本)
}

您可以使用此选项对数据进行排序:

var input = new IComparable[][]
{
    new IComparable[] {"Alex",  10,      10,      10,            10},
    new IComparable[] {"Danny", 20,      20,      20,            20},
    new IComparable[] {"Dave",  35,      40,      50,            40},
    new IComparable[] {"Goerge",0 ,      0 ,      0 ,            0 },
    new IComparable[] {"Hannan",0 ,      0 ,      0 ,            0 },
    new IComparable[] {"Ian",   0 ,      0 ,      0 ,            0 },
    new IComparable[] {"Muna",  0 ,      0 ,      0 ,            0 },
};

var indexOfColumnToOrderBy = 4; // "Final Grade" field
for (var i = 0; i < input.Length - 1; ++i)
{
    for (var j = i + 1; j < input.Length; ++j)
    {
        IComparable[] t;
        if (input[i][indexOfColumnToOrderBy].CompareTo(input[j][indexOfColumnToOrderBy]) < 0)
        {
            t = input[i];
            input[i] = input[j];
            input[j] = t;
        }
    }
}
像这样定义您的输入

var input = new Student[]
{
    new Student {Name = "Alex",    Test = 10,  Basket = 10, Destructive = 10,   FinalGrade = 10},
    new Student {Name = "Danny",   Test = 20,  Basket = 20, Destructive = 20,   FinalGrade = 20, },
    new Student {Name = "Dave",    Test = 35,  Basket = 40, Destructive = 50,   FinalGrade = 40, },
    new Student {Name = "Goerge",  Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Hannan",  Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Ian",     Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Muna",    Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
};
并使用Linq进行排序:

var sorted = input.OrderByDescending(student => student.FinalGrade).ToArray();

即使这种方法不能满足教授的要求,你也可以用它来调试你自己的算法

使用一个类比跨多个数组存储数据要容易得多我知道,但我目前受到教授想要的限制,没有简单的方法!你需要和你的教授谈谈,欢迎他来到21世纪。理解分类和不在课堂上分组是完全不同的。他完全可以教排序,同时教你正确的编码方法。我同意Aldert的观点,你应该去告诉你的教授他做错了,并欢迎他加入OOP centuryDismissing
数组。假设你仍然可以使用
List.Sort
Enumerable.OrderBy
:-)排序并不是问题我将如何显示这个?抱歉,我几乎不理解它,更不用说在我的代码中实现它了。@UnboundPhantom如果我们谈论控制台,你可以用foreach循环显示初始数组或排序数组,比如
foreach(输入中的var行){console.WriteLine(string.Join(,\t),row.AsEnumerable());
。如果我们谈论“如何在WinForms中显示锯齿数组”--这是一个与订购无关的新问题。您可以在单独的线程中使用它
private class Student
{
    public string Name { get; set; }
    public int Test { get; set; }
    public int Basket { get; set; }
    public int Destructive { get; set; }
    public int FinalGrade { get; set; }
}
var input = new Student[]
{
    new Student {Name = "Alex",    Test = 10,  Basket = 10, Destructive = 10,   FinalGrade = 10},
    new Student {Name = "Danny",   Test = 20,  Basket = 20, Destructive = 20,   FinalGrade = 20, },
    new Student {Name = "Dave",    Test = 35,  Basket = 40, Destructive = 50,   FinalGrade = 40, },
    new Student {Name = "Goerge",  Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Hannan",  Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Ian",     Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Muna",    Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
};
var sorted = input.OrderByDescending(student => student.FinalGrade).ToArray();