确定List< string[]比;主

本文关键字:List string 确定 | 更新日期: 2023-09-27 18:08:46

我有以下简化的输入:

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"};

首先我用两个循环解决了这个问题,然后我改变了我的方法来实现这个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();

它工作,但它似乎有点迂回对我来说。难道没有一种更简单的方法(内置的?)被我忽略了吗?

确定List< string[]比;主

有一个更好的解决方案:使用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();

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

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

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

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

这样怎么样:

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