确定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();
它工作,但它似乎有点迂回对我来说。难道没有一种更简单的方法(内置的?)被我忽略了吗?
有一个更好的解决方案:使用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() };