如何在C#中重新排列数组中的列?

时间:2016-08-05 20:48:30

标签: c# .net arrays

所以我有一个包含4列的数组。我还有一个单独的列表,用字符串定义每个列。类似下面的代码片段: -

List<string> headers = new List<string>();
headers.Add("Name");
headers.Add("Number");
headers.Add("ID");
headers.Add("License");

数组看起来像这样

Max 32445 1 KPFG35
Bill 33234 2 DGWEF9
Ruth 89428 3 SFD3FG

......等等。

现在,假设有人想要相同的数组,但列的排列方式为ID, Name, Number, License。如何操作数组中的列并生成一个新的列?谢谢你的帮助!

所以在上面提到的情况下,它会返回

1 Max 32445 KPFG35
2 Bill 33234 DGWEF9
3 Ruth 89428 SFD3FG

3 个答案:

答案 0 :(得分:2)

我不知道你是否必须使用List。但这里有一个可以帮助你的解决方案。我建议你使用DataTable

基本上我已经创建了一个带有datagridview和一个按钮的表单,

DataTable dt = new DataTable();

在表单加载中

 private void Form1_Load(object sender, EventArgs e)
    {
        dt.Columns.Add("Name");
        dt.Columns.Add("Number");
        dt.Columns.Add("ID");
        dt.Columns.Add("License");
        string[] array = { "Max", "32445", "1", "KPFG35", "Bill", "33234", "2", "DGWEF9", "Ruth", "89428", "3", "SFD3FG" };

        for (int i = 0; i < array.Length + 1; i++)
        {

            if (i != 0 && i % 4 == 0)  // every 4th item should be split from list
            {
                string[] tempArray = new string[4]; //temp array will keep every item until 4th one.
                tempArray = array.Take(i).ToArray(); //Take until 4th item.
                array = array.Skip(i).ToArray(); //then we don't need that items so we can skip them
                dt.Rows.Add(tempArray); //Row is done.
                i = -1; //Every skip will generate a new array so it should go back to 0.

            }
        }
        dataGridView1.DataSource = dt;

    }

还有一个按钮可以通过SetOrdinal更改订单,

private void button1_Click(object sender, EventArgs e)
        {
            dt.Columns["ID"].SetOrdinal(0);
            dataGridView1.DataSource = null;
            dataGridView1.DataSource = dt;
            dataGridView1.Refresh();

        }

输出,

enter image description here

按钮后单击ID列为0.(第二个)

希望有所帮助,(不确定是否必须使用List<string>,但它可能是您的线索。

答案 1 :(得分:0)

您实际上并没有移动列,而是重新排列它们。移动意味着列保持相同的顺序,但行向左或向右旋转。无论如何,在不使用数据结构但仅使用数组的情况下执行此操作将在代码中采用以下形式:

//Assuming the array is of type string
string[,] arr <--- the array we are talking about
string[,] ta = new string[3,4]; //a temporary array

/* The columns are arranged in the order: Name    Number    ID    License
    and we want it as: ------------       ID    Name    Number    License

    So, if the order of the columns is:    1   2   3   4, 
    we now want it as:  --------------     3   1   2   4  */

string order = "3124";
for(int i=0; i<3; i++){
    for(int j=0; j<4; j++){
        int k = int.Parse(order[j].ToString())-1;
                //k stores the column number in arr to be added to ta
        ta[i,j] = arr[i,k];
    }
}

//ta now stores arr in the new order
//you can either change the value of arr to the new array: arr = ta;
//or you can now make all your references to the new array ta

希望它对你有所帮助。

答案 2 :(得分:0)

正如其他人所建议的那样:将这些作为可维护性对象存储可能会更好。

但听起来你要求数组是你想保留的。因为您真正想做的就是在您上面移动一列并生成一个新列表,您可以执行以下操作:

private static IEnumerable<string> MoveIndexToFirst(List<string> input)
{
    for(int i = 0; i < input.Count; i+=4 )
    {
        yield return input[i+2];
        yield return input[i];
        yield return input[i+1];
        yield return input[i+3];
    }
}

用法:

List<string> newList = MoveIndexToFirst(yourData).ToList();