Получить первый элемент IGrouping - PullRequest
0 голосов
/ 19 сентября 2019
IEnumerable<IGrouping<long, MyClass>> datas = list.GroupBy(x => x.PropertyXYOfMyClass);

// get all items from each group
foreach (var grouping in datas)
{
    long groupKey = groupingByMyClass.Key;

    //iterating through values
    foreach (var item in groupingByMyClass)
    {
        long key = item.PropertyIntOfClassA;
        string property = item.PropertyA;
    }
}

Каждая группа содержит несколько элементов, как получить значения из первого элемента каждой группы?

ОБНОВЛЕНИЕ

void Extract()
{
    List<DataHolder> data = new List<DataHolder>();
    List<DateTime> randomTimes = new List<DateTime>();
    Random r = new Random();
    DateTime d = new DateTime(2019, 9, 19, 7, 0, 0);

    for (int i = 0; i < 100; i++)
    {
        DataHolder dh = new DataHolder();
        TimeSpan t = TimeSpan.FromSeconds(r.Next(0, 14400));  
        dh.OID = i;
        dh.Value = r.Next(50);
        dh.Snapshottime = d.Add(t);

        data.Add(dh);
     }

data.OrderBy(o => o.Snapshottime).ToList();

List<DataHolder> SortedList = data.OrderBy(o => o.Snapshottime).ToList();           

TimeSpan interval = new TimeSpan(0, 15, 0);
var result = SortedList.GroupBy(x => x.Snapshottime.Ticks / interval.Ticks) .OrderBy(x => x.Key);
}

public class DataHolder
{
    public int OID { get; set; }
    public double Value { get; set; }
    public DateTime Snapshottime { get; set; }       
}

Здесь из результата мне нужновзять первый предмет из каждой группы.

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

попробуйте это:

var finalResult = result.Select(gpr=>grp.First());

или если вы хотите самый ранний / последний / и т. Д., Вы можете заказать сначала:

var finalResult = result.Select(gpr=>grp.OrderBy(x=>x.SnapShotTime).First());
1 голос
/ 19 сентября 2019

Вы уже сделали тяжелую работу.Сделайте простой цикл для результата:

var result = SortedList.GroupBy(x => x.Snapshottime.Ticks / interval.Ticks) .OrderBy(x => x.Key);
var resultList = new List<DataHolder>();

foreach(var group in result)
{

    resultList.Add(group.First());

}

Надеюсь, это поможет.

...