C# 从asp.net中的另一个列表填充要列出的数据
我有一个动态存储数据库数据的列表C# 从asp.net中的另一个列表填充要列出的数据,c#,asp.net,list,C#,Asp.net,List,我有一个动态存储数据库数据的列表 List<string> StoreData=new List<string>(); 例如,它的值可以是 10,1,100 9,2,200 10,2,700 8,3,600 8,2,100 8,1,500 现在我想循环浏览这个列表,需要创建另一个列表,它应该以下面的格式存储数据 8,100,500,600 9,0,200,0 10,100,700,0 也就是说,它应该按照MonthNumber和Categoryid的升序
List<string> StoreData=new List<string>();
例如,它的值可以是
10,1,100
9,2,200
10,2,700
8,3,600
8,2,100
8,1,500
现在我想循环浏览这个列表,需要创建另一个列表,它应该以下面的格式存储数据
8,100,500,600
9,0,200,0
10,100,700,0
也就是说,它应该按照MonthNumber和Categoryid的升序存储数据。不需要存储类别ID。但是价格顺序应该基于Categoryid。首先,您的输入非常奇怪,如果您有选择权,您可能不应该有一个字符串列表,以现在的方式表示您的数据 现在,为了从一种格式的数据转换为另一种格式,最好先解析数据并将其映射到一个能够很好地表示数据的数据结构,然后使用此数据结构将其格式化为您想要的任何格式 首先,我们将所有数据解析为一个新的
列表
:
var parsedList = inputList.Select(i => {
var splittedAndParsed = i.Split(",").Select(int.parse);
return splittedAndParsed;
});
运行此操作后,parsedList
将为每行数据包含一个新的列表
,该列表保存该行每列的已解析整数值
现在,我们希望将这些数据存储到字典中,以便为id聚合所有价格和类别。为了存储类别和价格数据,我们将引入class
:
public class Price {
public int CategoryId { get; set; }
public int Price { get; set; }
}
现在我们使用它来创建字典
:
var dict = new Dictionary<int, List<Price>>();
parsedList.ForEach(pl => {
if(!dict.ContainsKey(pl[0], new List<Price>())) {
dict.Add(pl[0]);
}
dict[pl[0]].Add(new Price { CategoryId = pl[1], Price = pl[2] });
});
当类别列表没有3列时,这不会填充0,但您可以轻松添加这些列。共享
Linq
唯一解决方案:
var result = StoreData.GroupBy(s => s.Split(',')[0])
.Select(x => x.Key +"," +
string.Join(",", Enumerable.Range(1,3)
.Select(r => x.FirstOrDefault(z => z.Split(',')[1] == r + "") != null ?
x.FirstOrDefault(z => z.Split(',')[1] == r + "")
.Split(',')[2] : "0")));
为什么
9,0200,0
而不是9200
或9,0,0200
?那么,到目前为止你都做了哪些尝试?你开始创作了吗?@AlfieGoodacre StoreData列表包含92200个。其中2是类别ID。categoryid 1和3没有值。因此它应存储为零。9,0200,0井。将多个值存储到一列中并不是最佳做法。我想你应该检查一下你的数据库storage@user2431727当前位置另外,为了让我们花时间研究您的问题,我们想看看您做了哪些尝试。因为它不是一个代码编写服务。你对一些具体的问题有意见吗?
foreach(var kvp in dict) {
var sorted = kvp.Value.Sort(p => p.Category);
string write = $"{kvp.Key},;
sorted.ForEach(s => write.Append($"{s},");
Console.WriteLine(write);
}
var result = StoreData.GroupBy(s => s.Split(',')[0])
.Select(x => x.Key +"," +
string.Join(",", Enumerable.Range(1,3)
.Select(r => x.FirstOrDefault(z => z.Split(',')[1] == r + "") != null ?
x.FirstOrDefault(z => z.Split(',')[1] == r + "")
.Split(',')[2] : "0")));