Преобразовать записи списка в массив - PullRequest
0 голосов
/ 12 января 2019

Чтобы создать график с использованием d3, мне нужно преобразовать мой список записей времени в несколько массивов.

Я храню свои данные в виде списка рабочих записей в день на одного сотрудника

Мне нужно иметь возможность получить массив всех дней, а затем массив каждого сотрудника.

Допустим, у персонала x 3,5 часа против 01.01.19 и 4,5 часа против 03/1/19
Персонал у меня есть 6 часов agaist 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 голосов
/ 12 января 2019

Если я вас правильно понимаю, вы хотите разбить список объектов на отдельные поля полей.

Если да, допустим, у вас есть следующий список

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

и т. Д., Где вы можете применить условие для фильтрации по элементам

0 голосов
/ 12 января 2019

Предполагая, что у вас есть класс с именем StaffMember, который выглядит следующим образом:

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

И после добавления следующего конструктора в ваш TicketWorkRecord класс:

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

Давайте создадим фиктивные данные для X и Y сотрудников:

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
0 голосов
/ 12 января 2019

Если 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...