确定列表<string []>数据透视

时间:2015-08-19 11:31:04

标签: c# string linq list

我有以下简化输入:

List<string[]> sList = new List<string[]>();
sList.Add(new string[]{ "Product", "ProductID"});
sList.Add(new string[] { "Fork", "1" });
sList.Add(new string[] { "Spoon", "2" });
sList.Add(new string[] { "Knife", "3" });

我想要以下输出

ResultList[0] == { "Product" ,"Fork","Spoon","Knife"};
ResultList[1] == { "ProductID" ,"1","2","3"};

首先我用2个循环解决了这个问题,然后我改变了我对这个linq的方法(两个都工作):

List<string[]> Result = sList.SelectMany(x => x)
  .Select((x, index) => new KeyValuePair<int, string>(index % sList.First().Length, x))
  .GroupBy(s => s.Key).Select(g => g.Select(x => x.Value)
  .ToArray()).ToList();

它有效,但对我来说似乎有点迂回。是不是有一个更简单的方法(内置?)我忽略了?

3 个答案:

答案 0 :(得分:2)

有一个更好的解决方案:使用Dictionary<TKey, TValue>

Dictionary<string, string> products = new Dictionary<string, string>()
{
     { "Fork", "1" },
     { "Spoon", "2" }
};

现在,您可以访问products.Keys(将获取产品名称)和products.Values(将获得产品标识符):

ResultList[0] = new [] { "Product" }.Union(products.Values);
ResultList[1] = new [] { "ProductID" }.Union(products.Keys);

可能的自动化:

List<List<string>> resultList = new [] { "Product", "ProductID" }
                    .Select((g, index) => (index == 0 ? new [] { g }.Union(products.Keys) : new [] { g }.Union(products.Values)).ToList())
                    .ToList();
顺便说一句,只要您将数据存储在字典中,我就没有理由添加&#34;列名称&#34;如果您知道产品名称为products.Keys和标识符products.Values,则会显示结果。也就是说,你可以直接使用字典......

答案 1 :(得分:1)

这样的事情:

List<string[]> sList = new List<string[]>();
sList.Add(new string[] { "Product", "ProductID" });
sList.Add(new string[] { "Fork", "1" });
sList.Add(new string[] { "Spoon", "2" });
sList.Add(new string[] { "Knife", "3" });

var res = new List<string[]> { sList.Select(a => a[0]).ToArray(), sList.Select(b => b[1]).ToArray() };

答案 2 :(得分:1)

因此,如果您确定每个数组恰好包含2个元素,那么问题就会变成两个简单的选择。但是,如果您只知道所有数组的大小相同,但又不想依赖于确切的数字,那么这种方法应该这样做:

List<string[]> Result =         
    sList.First()
         .Select((x, i) => i)
         .Select(i => sList.Select(x => x[i]).ToArray())
         .ToList();

我们基本上使用sList中的第一项来计算数组中有多少成员,然后对每个成员进行选择。