【问题标题】:Determine List<string[]> Pivot确定列表<string[]> 枢轴
【发布时间】:2015-08-19 11:31:03
【问题描述】:

我有以下简化输入:

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();

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

【问题讨论】:

  • 对于像new {new String[] {"1", "2"}, new String[] {"A"}, new String[] {"3", "4", "5"}}; 这样的锯齿状数据,您希望得到什么结果?你想如何表示一个hole,即“2”hole“4”?
  • @DmitryBychenko - 所有行的列数总是相等的 - 你可以依赖
  • 试试这个:var result = new List&lt;string[]&gt; { sList.Select(x =&gt; x[0]).ToArray(), sList.Select(x =&gt; x[1]).ToArray() };
  • 您要查找的操作通常称为transpose。见this example

标签: c# string linq list


【解决方案1】:

对此有更好的解决方案:使用Dictionary&lt;TKey, TValue&gt;

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();

顺便说一句,只要您将数据存储在字典中,如果您知道产品名称是 products.Keys 和标识符 products.Values,我找不到在结果中添加“列名称”的理由。也就是说,您可以直接使用字典...

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我赞成所有 3 个答案,因为我没有想到任何一个。我接受这对我来说似乎是最通用的。
    【解决方案3】:

    这样的事情怎么样:

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

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多