将数据填充到asp.net中另一个List的List

时间:2017-05-23 09:22:10

标签: c# asp.net list

我有一个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为基础。

2 个答案:

答案 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")));

Dotnet Fiddle Demo