【问题标题】:Populate datas to List from another List in asp.net将数据从asp.net中的另一个列表填充到列表
【发布时间】:2017-05-23 09:22:09
【问题描述】:

我有一个从数据库动态存储数据的列表。

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 并需要创建另一个 list ,它应该以以下格式存储数据。

8,100,500,600
9,0,200,0
10,100,700,0

即按MonthNumber和Categoryid升序存储数据。无需存储 Categoryid。但价格顺序应以 Categoryid 为基础。

【问题讨论】:

  • 为什么是9,0,200,0 而不是9,2009,0,0,200
  • 嗯,到目前为止你尝试了什么?你开始创作了吗?
  • @AlfieGoodacre StoreData 列表包含 9,2,200。其中 2 是类别 ID。 categoryid 1 和 3 没有值。因此它应该存储为零。 9,0,200,0
  • 好吧。将多个值存储到一列中并不是真正的最佳实践。我认为您应该检查您的数据库存储
  • @user2431727 :为了让我们花时间解决您的问题,我们希望了解您的尝试。因为它不是代码编写服务。你有什么具体的问题吗?

标签: c# asp.net list


【解决方案1】:

首先,您的输入很奇怪,如果您可以选择,您可能不应该像现在这样拥有代表您的数据的字符串列表。

现在为了从一种格式的数据转换到另一种格式,最好先解析数据并将其映射到一个能够很好地代表你的数据的数据结构,然后使用这个数据结构将它格式化成任何格式你想要的。

首先,我们将所有数据解析成一个新的list

var parsedList = inputList.Select(i => { 
    var splittedAndParsed = i.Split(",").Select(int.parse);
    return splittedAndParsed;
}); 

运行此命令后,parsedList 将为每一行数据包含一个新的list,该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,但您可以轻松添加它们。

【讨论】:

    【解决方案2】:

    分享一个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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2019-03-21
      • 2010-12-24
      • 2016-05-28
      • 1970-01-01
      相关资源
      最近更新 更多