我有一个List,可以从数据库中动态存储数据。
List<string> StoreData=new List<string>();
按照下面给出的顺序存储数据
MonthNumber(1=jan,2=feb,3=mar etc),Categoryid(1,2,3),TotalPrice
例如,它的值可以是,
10,1,100
9,2,200
10,2,700
8,3,600
8,2,100
8,1,500
现在我想遍历此List并需要创建另一个列表,该列表应该以下面的格式存储数据。
8,100,500,600
9,0,200,0
10,100,700,0
也就是说,它应该按MonthNumber和Categoryid的升序存储数据。无需存储Categoryid。但价格订单应该以Categoryid为基础。
答案 0 :(得分:0)
首先,您的输入非常奇怪,如果您有选项,则可能没有像现在这样的方式表示数据的字符串列表。
现在,为了从1种格式的数据转换到另一种格式,最好首先解析数据并将其映射到实际代表数据的数据结构,然后使用此数据结构进行格式化它可以是你想要的任何格式。
首先,我们将所有数据解析为新的list
:
var parsedList = inputList.Select(i => {
var splittedAndParsed = i.Split(",").Select(int.parse);
return splittedAndParsed;
});
运行此操作后,parsedList
将为每行数据包含一个新的list
,其中包含该行每列的已解析整数值。
现在我们要将这些数据存储到字典中,以便我们为id聚合所有价格和类别。我们将引入class
以存储类别和价格数据:
public class Price {
public int CategoryId { get; set; }
public int Price { get; set; }
}
现在我们使用它来创建dictionary
:
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] });
});
现在我们dict
以您可以轻松访问的方式保存您的所有数据,并以您希望的方式格式化。
例如你可以这样做:
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);
}
当类别列表没有3列时,这不会填充0,但您可以添加这些列而不会有太多麻烦。
答案 1 :(得分: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")));