【问题标题】:Restructuring an object into a different type将对象重构为不同的类型
【发布时间】:2021-12-02 01:07:34
【问题描述】:

我有一个包含步行统计数据的 SQL 数据库。

我将数据从 SQL 提取到 C# 到“事务”列表中。事务是一个类,表示某个人在某一天走了多少公里,即

public class Transaction
{
    public Transaction(string firstName, string lastName, DateTime date, int kilomtersWalked)
    {
        FirstName = firstName;
        LastName = lastName;
        Date = date;
        KilometersWalked = kilomtersWalked;
    }
  
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime Date { get; set; }
    public int KilometersWalked { get; set; }

}

我从 SQL 填充列表,但为了说明数据,我将在此处使用硬编码值对其进行实例化。

List<Transaction> transactions = new List<Transaction>
        {
            new Transaction("Michael", "Smith", new DateTime(2021, 01, 01), 5),
            new Transaction("Michael", "Smith", new DateTime(2021, 01, 02), 8),
            new Transaction("Michael", "Smith", new DateTime(2021, 01, 03), 7),
            new Transaction("Hillary", "Johnson", new DateTime(2021, 01, 01), 12),
            new Transaction("Hillary", "Johnson", new DateTime(2021, 01, 02), 3),
            new Transaction("Hillary", "Johnson", new DateTime(2021, 01, 03), 6)
        };

我想将数据转换为“PersonStats”列表。 PersonStats 是一个类,表示特定人步行的公里数,不仅仅是一天,而是每一天,即

public class PersonStats
{
    public PersonStats(string firstName, string lastName, DateTime[] dates, int[] kilomtersWalked)
    {
        FirstName = firstName;
        LastName = lastName;
        Dates = dates;
        KilometersWalked = kilomtersWalked;
    }
  
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime[] Dates { get; set; }
    public int[] KilometersWalked { get; set; }

}

虽然我付出了很多努力,但我仍然无法想出一种优雅的方式来做到这一点。任何想法将不胜感激!

【问题讨论】:

  • 您打算如何持久存储它?还是我们只是在每次应用运行时计算它。

标签: c# object


【解决方案1】:

您可以通过对 FirstName 和 LastName 进行分组来创建 PersonStats 的实例。最好为每个人和组引入一个唯一的 ID,因为世界上有很多 Michael Smiths。

var ps = transactions
    .GroupBy(g => new { g.FirstName, g.LastName })
    .Select(g => new PersonStats(
        g.Key.FirstName, 
        g.Key.LastName, 
        g.Select(_ => _.Date).ToArray(),
        g.Select(_ => _.KilometersWalked).ToArray()));

【讨论】:

  • 请注意,单独选择 Date 和 KilometersWalked 仍将配对正确的日期和距离。 GroupBy 中的顺序是稳定的。 stackoverflow.com/a/12377922/141172
  • 谢谢 Eric,这个解决方案非常适合我!您是否也碰巧对我如何从 PersonStats 的分组对象返回到 Transaction 列表有建议?
  • 查看SelectMany() 以编写一个反转此操作的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多