将列表项转换为数组

时间:2019-01-12 16:35:04

标签: c# arrays list

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

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

我需要能够获得一个整天的数组,然后每个员工每个都有一个数组。

因此,假设x员工在01/1/19上有3.5h,在03/1/19上有4.5h
职员y有6h反对2/1/19

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

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; }
}

3 个答案:

答案 0 :(得分:0)

如果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语句产生以下输出:

enter image description here

答案 1 :(得分:0)

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

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

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

依此类推,您可以将条件应用于根据成员进行过滤的位置

答案 2 :(得分:0)

假设您有一个名为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