C# 从数组中输出不同的元素,并从其他关联数组中输出其数据

C# 从数组中输出不同的元素,并从其他关联数组中输出其数据,c#,arrays,sorting,C#,Arrays,Sorting,这样输出数据的最佳方式是什么?我觉得用一个例子来解释要比用文字来解释好得多 如果我有这样的数据 Array1 Array2 Array3 Array4 A 0 10 100 A 1 11 101 C 2 12 102 B 3 13 103 A 4 14 104 C 5 15 105 B 6 16

这样输出数据的最佳方式是什么?我觉得用一个例子来解释要比用文字来解释好得多

如果我有这样的数据

Array1 Array2 Array3 Array4

A      0      10     100

A      1      11     101

C      2      12     102

B      3      13     103

A      4      14     104

C      5      15     105

B      6      16     106

C      7      17     107

C      8      18     108

B      9      19     109
我想把它输出到文件中

归档

0 10 100

1 11 101

4 14 104
文件B

3 13 103

6 16 106

9 19 109
文件C

2 12 102

5 15 105

7 17 107

8 18 108 
数组1中可以有任意数量的不同元素。因此,如果有X个不同的元素,我需要创建X个文件

数组是字符串数组。它们具有相同数量的元素

我将尝试用文字解释我想做的事情:我想选择一个数组,在本例中是Array1,获取Array1中的所有不同元素,为Array1中的每个不同元素创建一个CSV文件,将不同元素的名称作为文件名,并在文件中包含来自其他数组的所有数据


做这件事的最佳方法是什么?

使用适当结构的数组或多维数组会更容易,但使用您现有的

您可以“压缩”阵列

var bigArray = Array1.Zip(Array2, (a1, a2) => new {a1, a2})
                     .Zip(Array3, (a12, a3) => new {a12.a1, a12.a2, a3})
                     .Zip(Array4, (a123, a4) => new {a123.a1, a123.a2, a123.a3, a4})
然后按第一个数组中的值分组:

var query = bigArray.GroupBy(a => a.a1);
var query = from i in Enumerable.Range(0, Array1.Length)
            select new {
                FileName = Array1[i],
                Value1 = Array2[i],
                Value2 = Array3[i],
                Value3 = Array4[i]
            } into x
            group x by x.FileName into g
            select g;
然后在循环中“输出”:

foreach(var file in query)
{
     Console.WriteLine("File {0}", file.Key);
     foreach(var item in file)
         Console.WriteLine("{0} {1} {2}", item.a2, item.a3, item.a4);
} 

假设有四个数组,每个数组的元素数完全相同:

string[] Array1;
string[] Array2;
string[] Array3;
string[] Array4;
第一步是从数组中创建匿名类型,然后根据第一个数组中的值对对象进行分组:

var query = bigArray.GroupBy(a => a.a1);
var query = from i in Enumerable.Range(0, Array1.Length)
            select new {
                FileName = Array1[i],
                Value1 = Array2[i],
                Value2 = Array3[i],
                Value3 = Array4[i]
            } into x
            group x by x.FileName into g
            select g;
通过此查询,您可以将数据保存到文件:

foreach(var group in query)
{
   using (var writer = File.CreateText(group.FileName))
   {
       foreach(var item in group)
            writer.WriteLine(String.Format("{0} {1} {2}",
                             item.Value1, item.Value2, item.Value3));
   }
}

注意:如果您有相关数据-例如,数组1中的第二项与数组2中的第二项相关,并且两者都与数组3中的第二项相关,则最好使用单个数据结构数组,将所有相关项保存在一起。当然,为变量指定有价值的名称。

数组有哪些类型?它们是否有相同数量的元素?您应该使用具有有意义属性的类。如果有任意数量的数组,我将如何调整您的解决方案?@user3240815如何获得这些数组?每个数组都有变量吗?我读入一个CSV文件,读入一行,然后使用.Split(“,”)获取数组中的所有列名。我得到一个数组,它告诉我要在输出中包括哪些列。然后我使用嵌套的for循环查找所选列的位置,并将其存储在int列表中。例如,如果列是a、B、C、D、E,并且我只需要a、C、E,那么我的列表将具有“0”、“2”、“4”。然后我制作一个字符串列表,大小为“上面int列表的长度”,即3,然后将CSV中的信息解析为strings@user3240815我建议将CSV行直接解析为强类型对象。顺便说一句,你从哪里得到一个数组,它告诉我输出中要包括哪些列?这个数组告诉我输出中要包括哪些列,它是给这个程序的一个参数。您知道有一个链接告诉我什么是强类型对象,以及如何在程序中使用它吗?非常感谢你迄今为止的帮助