我有以下简化输入:
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();
它有效,但对我来说似乎有点迂回。是不是有一个更简单的方法(内置?)我忽略了?
答案 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
中的第一项来计算数组中有多少成员,然后对每个成员进行选择。