【问题标题】:Convert list entries to array将列表条目转换为数组
【发布时间】:2019-01-12 16:35:03
【问题描述】:

为了使用 d3 生成图表,我需要将时间条目列表转换为多个数组。

我将我的数据存储在每个员工每天的工作记录列表中

我需要能够获取所有日期的数组,然后是每个员工的数组。

假设员工 x 对 01/1/19 有 3.5 小时,对 03/1/19 有 4.5 小时
工作人员 y 在 2/1/19 有 6 小时

我希望我的数组如下所示:

Dates[1/1/19, 2/1/19, 3/1/19]
X[3.5,0,4.5]
Y[0,6,0]

我的一些代码是:

public IEnumerable<TicketWorkRecord> TimeByDateByStaff { get; set; }

public class TicketWorkRecord
{
    public DateTime Date { get; set; }
    public decimal TimeSpent { get; set; }
}

【问题讨论】:

  • 也许是时候添加所有代码尝试了?

标签: c# arrays list


【解决方案1】:

假设您有一个名为 StaffMember 的类,如下所示:

public class StaffMember
{
    public IEnumerable<TicketWorkRecord> TimeByDateByStaff { get; set; }
    // Other properties
}

在将以下构造函数添加到您的 TicketWorkRecord 类之后:

public TicketWorkRecord(DateTime date, decimal timeSpent)
{
    Date = date;
    TimeSpent = timeSpent;
}

让我们为XY 员工创建一个虚拟数据:

StaffMember X = new StaffMember
{
    TimeByDateByStaff = new List<TicketWorkRecord>()
                        {
                            new TicketWorkRecord(DateTime.Today.Date, 3.5M),
                            new TicketWorkRecord(DateTime.Today.Date.AddDays(2), 4.5M)
                        }
};
StaffMember Y = new StaffMember
{
    TimeByDateByStaff = new List<TicketWorkRecord>()
                        { new TicketWorkRecord(DateTime.Today.Date.AddDays(1), 6M) }
};

var staffMembers = new List<StaffMember>() { X, Y };

现在,您可以使用以下代码构建您想要的 3 个数组:

var dates = staffMembers.SelectMany(s => s.TimeByDateByStaff)
                                        .Select(t => t.Date)
                                        .Distinct()
                                        .OrderBy(d => d).ToArray();
var xTimes = dates.Select(d => X.TimeByDateByStaff
                                .FirstOrDefault(t => t.Date == d)?.TimeSpent ?? 0).ToArray();
var yTimes = dates.Select(d => Y.TimeByDateByStaff
                                .FirstOrDefault(t => t.Date == d)?.TimeSpent ?? 0).ToArray();

测试它:

Console.WriteLine("Dates: " + string.Join(",", dates.Select(d => d.ToShortDateString())));
Console.WriteLine("xTimes: " + string.Join(",", xTimes));
Console.WriteLine("yTimes: " + string.Join(",", yTimes));

输出:

Dates: 12/01/2019,13/01/2019,14/01/2019
xTimes: 3.5,0,4.5
yTimes: 0,6,0

【讨论】:

    【解决方案2】:

    如果TicketWorkRecord 有一个属性指定它是哪个员工(X 或 Y),那么使用 LINQ 会非常简单:

    var dates = TimeByDateByStaff.Select(x => x.Date.ToString("MM/dd/yy")).ToArray();
    var staffXTimeSpent = TimeByDateByStaff.Select(x => x.StaffMember == "X" ? x.TimeSpent : 0M).ToArray();
    var staffYTimeSpent = TimeByDateByStaff.Select(x => x.StaffMember == "Y" ? x.TimeSpent : 0M).ToArray();
    

    或者,如果在编译时不知道确切的工作人员,那么您可以在运行时按工作人员获取时间条目:

    var timeSpentByStaffMembers = TimeByDateByStaff
        .Select(x => x.StaffMember)
        .Distinct()
        .ToDictionary(
            key => key, 
            value => TimeByDateByStaff.Select(x => x.StaffMember == value ? x.TimeSpent : 0M).ToArray());
    

    有以下数据:

    var TimeByDateByStaff = new List<TicketWorkRecord>
    {
        new TicketWorkRecord
        {
            Date = new DateTime(2019, 1, 1),
            TimeSpent = 3.5M,
            StaffMember = "X"
        },
        new TicketWorkRecord
        {
            Date = new DateTime(2019, 2, 1),
            TimeSpent = 6M,
            StaffMember = "Y"
        },
        new TicketWorkRecord
        {
            Date = new DateTime(2019, 3, 1),
            TimeSpent = 4.5M,
            StaffMember = "X"
        }
    };
    

    上面的 LINQ 语句产生以下输出:

    【讨论】:

      【解决方案3】:

      如果我理解正确,您希望将对象列表拆分为单个字段数组。

      如果是,假设您有以下列表

      List<Object> ObjectsList = ObjectsList;
      string[] ExtractDates = ObjectsList.Select(x=>x.Date).ToArray();
      double[] TimeSpent = ObjectsList.Select(x=> x.TimeSpent).ToArray();
      

      等等,你可以应用 where 条件来根据成员进行过滤

      【讨论】:

        猜你喜欢
        • 2012-11-29
        • 2018-07-13
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多