2 / 2 / 1
Регистрация: 06.09.2015
Сообщений: 81
1

Найти максимальную разницу времени между соседними объектами в первых 5-ти элементах коллекции

15.09.2017, 10:37. Показов 1804. Ответов 7
Метки нет (Все метки)

Добрый день!

С Linq работал не очень много, поэтому прошу помощи профессионалов.

Создана коллекция sequences, каждый элемент которой содержит коллекцию объектов Observation.
Объект Observation содержит элементы enum Element и DateTime Time.

Задача найти максимальную разницу времени между соседними объектами Observation в первых 5-ти элементах коллекции sequences.

Например в этом элементе коллекции sequences(выделил в коде красным)
new Observation[] { new Observation(measureStartPoint, Element.Atlanta), new Observation(m1s, Element.Banana), new Observation(m3s, Element.Banana), new Observation(m4s, Element.Atlanta) }

максимальная разница времени между соседними объектами будет 2 секунды.

new Observation(measureStartPoint, Element.Atlanta) здесь значение времени 0 секунд
new Observation(m1s, Element.Banana) здесь значение времени 1 секунд
new Observation(m3s, Element.Banana) здесь значение времени 3 секунд
new Observation(m4s, Element.Atlanta) здесь значение времени 4 секунд


Ход моих мыслей.
1) сначала получаем первые 5 элементов

var projection = sequences.Take(5);

2) Теперь отсюда нужно извлечь значения секунд и попарно сравнить для определения максимальной разницы времени

Хотел сделать так, но не работает

var data= projection.SelectMany(x=>x.Time.Second);

Что подскажите?




C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.Collections.Generic;
using System.Linq;
 
public enum Element
{
    Atlanta,
    Banana,
    Cheese,
    Domino,
    Elephant,
    Freedom,
    Government,
    Hurricane,
    Lovecraft
}
 
public class Observation
{
    public DateTime Time { get; private set; }
    public Element Value { get; private set; }
    
    public Observation(DateTime time, Element element)
    {
        Time = time;
        Value = element;
    }
}
 
 
 
                    
public class Program
{
    public static void Main()
    {
        var measureStartPoint = new DateTime(2017, 8, 30, 8, 40, 0);
        var m1s = measureStartPoint.AddSeconds(1);
        var m2s = measureStartPoint.AddSeconds(2);
        var m3s = measureStartPoint.AddSeconds(3);
        var m4s = measureStartPoint.AddSeconds(4);
        var m5s = measureStartPoint.AddSeconds(5);
        
        IEnumerable<IEnumerable<Observation>> sequences = 
            new [] 
            {
                [COLOR="Red"]new Observation[] { new Observation(measureStartPoint, Element.Atlanta), new Observation(m1s, Element.Banana), new Observation(m3s, Element.Banana), new Observation(m4s, Element.Atlanta) }[/COLOR],
                new Observation[] { new Observation(measureStartPoint, Element.Elephant), new Observation(m4s, Element.Domino), new Observation(m5s, Element.Elephant) },
                new Observation[] { },
                new Observation[] { new Observation(m1s, Element.Elephant), new Observation(m2s, Element.Elephant), new Observation(m3s, Element.Domino) },
                new Observation[] { new Observation(m4s, Element.Lovecraft) },
                new Observation[] { new Observation(measureStartPoint, Element.Atlanta), new Observation(m1s, Element.Cheese) },
                new Observation[] { new Observation(measureStartPoint, Element.Banana), new Observation(m2s, Element.Banana) },
                new Observation[] { new Observation(measureStartPoint, Element.Freedom), new Observation(m2s, Element.Freedom), new Observation(m4s, Element.Freedom) },
                new Observation[] { new Observation(m1s, Element.Government), new Observation(m4s, Element.Atlanta), new Observation(m5s, Element.Hurricane) },
                new Observation[] { new Observation(measureStartPoint, Element.Cheese), new Observation(m1s, Element.Banana), new Observation(m2s, Element.Lovecraft),  new Observation(m3s, Element.Banana), new Observation(m4s, Element.Freedom)},
                new Observation[] { new Observation(m3s, Element.Banana) },
                new Observation[] { new Observation(m1s, Element.Banana) },
                new Observation[] { new Observation(m1s, Element.Domino), new Observation(m3s, Element.Domino), new Observation(m3s, Element.Freedom) },
                new Observation[] { new Observation(measureStartPoint, Element.Hurricane), new Observation(m5s, Element.Elephant) },
                new Observation[] { new Observation(m1s, Element.Atlanta) },
                new Observation[] { new Observation(measureStartPoint, Element.Lovecraft), new Observation(m2s, Element.Atlanta) },
                new Observation[] { new Observation(measureStartPoint, Element.Lovecraft), new Observation(m2s, Element.Atlanta),  new Observation(m3s, Element.Cheese) },
                new Observation[] { new Observation(measureStartPoint, Element.Lovecraft), new Observation(m1s, Element.Atlanta),  new Observation(m4s, Element.Cheese) },
                new Observation[] { new Observation(m2s, Element.Banana), new Observation(m4s, Element.Banana) },
                new Observation[] { new Observation(m1s, Element.Atlanta),  new Observation(m2s, Element.Cheese)}
            };
        
        if(!sequences.Any()) return;
        
        var projection = String.Join(" ", sequences.First().Select(x =>  x.Value.ToString()));
        
        
    
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2017, 10:37
Ответы с готовыми решениями:

Найти максимальную разницу между соседними элементами
Найти максимальную разницу между соседними элементами списка

Определить максимальную разницу между двумя соседними элементами массива
Помогите пожалуйста. Хотя бы частью программы Задание: Напишите программу, которая позволяет...

Найти разницу между соседними простыми числами
Можно любым способом найти все простые числа до заданного N, и выводить разницу между простыми...

Найти наибольшую разницу между двумя соседними выведенными числами
Дана последовательность из целых чисел, которые вводятся по одному. За последним числом вводится...

7
3449 / 2458 / 1168
Регистрация: 14.08.2016
Сообщений: 8,148
15.09.2017, 20:17 2
я бы примерно так сделал, если, конечно, я правильно понял задачу
C#
1
2
        var projection = sequences.Take(5).Select(x => x.Select(y => y.Time).Max() - x.Select(y => y.Time).Min()).Max();
        Console.WriteLine(projection.TotalSeconds);
0
6190 / 2442 / 717
Регистрация: 11.04.2015
Сообщений: 3,952
Записей в блоге: 43
15.09.2017, 22:04 3
degvelo, честно говоря, у меня такое ощущение, что либо я не чего-то не понял, либо в твоем объяснении есть нестыковки: с одно стороны ты говоришь, что надо найти разницу между именно соседними элементами, с другой - даешь пример
Цитата Сообщение от degvelo Посмотреть сообщение
new Observation(measureStartPoint, Element.Atlanta) здесь значение времени 0 секунд
new Observation(m1s, Element.Banana) здесь значение времени 1 секунд
new Observation(m3s, Element.Banana) здесь значение времени 3 секунд
new Observation(m4s, Element.Atlanta) здесь значение времени 4 секунд
Здесь у последнего элемента 4 секунды разница с самым первым, а не с соседним, с которым у него разница только одна секунда. В принципе, если ты ошибся именно в примере и нужен таки максимум по соседним элементам, то можно как-то так
C#
1
2
        var maxdif = from Observation[] sequence in sequences
                     select sequence.Zip(sequence.Skip(1), (o1, o2) => o2.Time - o1.Time).Max();
Здесь получается коллекция таймспанов представляющих максимумы по каждой группе, дальше можешь брать хоть пять первых, хоть какие угодно. Но тут возникает вторая проблема: если взять для проверки твой пример набора данных, ошибка вылетит на тех элементах, где группа содержит менее двух элементов, но здесь ты не объяснил как это надо обрабатывать и что считать максимальной разницей, если коллекция не содержит хотя бы двух элементов.
0
2 / 2 / 1
Регистрация: 06.09.2015
Сообщений: 81
15.09.2017, 22:58  [ТС] 4
Может не совсем правильно объяснил.
new Observation(measureStartPoint, Element.Atlanta) здесь значение времени 0 секунд
new Observation(m1s, Element.Banana) здесь значение времени 1 секунд
new Observation(m3s, Element.Banana) здесь значение времени 3 секунд
new Observation(m4s, Element.Atlanta) здесь значение времени 4 секунд

Здесь между первым и вторым элементом разница 1 секунда
между вторым и третьим 2 секунды
между третьим и четвертым 1 секунда.

Соотвественно максимальная разница составляет 2 секунды.

Я ее решил, но не совсем c помощью Linq, что не удовлетворило работодателя (((

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static List<int> numbers = new List<int>();
    
    static int max;
 
 
var data=sequences.Take(5).ToArray();
        
        
        for(int i=0;i<data.Length;i++)
        {
             
            foreach(int a in data[i].Select(t=>t.Time.Second))
             {
                 
                numbers.Add(a);
            
             }
        }   
        
         max=numbers[0]-numbers[1];
        for(int i=1;i<numbers.Count()-1;i++)
        {
                //Console.WriteLine(numbers[i]);
                 if(numbers[i]-numbers[i+1]>max)
                 max=numbers[i]-numbers[i+1];
             
        }   
        Console.WriteLine(max);
0
6190 / 2442 / 717
Регистрация: 11.04.2015
Сообщений: 3,952
Записей в блоге: 43
15.09.2017, 23:02 5
degvelo, Ну в принципе я так и понял и мой пример, собственно об этом. Но только для случаев когда в массиве менее двух элементов - непонятно как их обрабатывать.
0
2 / 2 / 1
Регистрация: 06.09.2015
Сообщений: 81
15.09.2017, 23:23  [ТС] 6
Было 5 минут на решение.

Добавлено через 3 минуты
Diamante, к сожалению не получается.
Ошибка
Run-time exception (line 122): Sequence contains no elements
0
6190 / 2442 / 717
Регистрация: 11.04.2015
Сообщений: 3,952
Записей в блоге: 43
15.09.2017, 23:28 7
Лучший ответ Сообщение было отмечено degvelo как решение

Решение

Цитата Сообщение от degvelo Посмотреть сообщение
к сожалению не получается.
Объясняю в третий раз: у тебя есть коллекции, в которых содержится менее двух элементов, в качестве примера смотри строки 49 и 51 своего кода из первого поста. Я не знаю как их надо интерпретировать и ты мне этого не объяснил, хотя до этого поста я дважды об этом написал. Нужно выбирать разницу дат, а когда дата одна или вообще нет, то какая будет разница? На этих объектах и происходит сбой. Ну если их надо интерпретировать как 0, то можно написать так
C#
1
2
3
4
5
6
7
        var maxdif = from Observation[] sequence in sequences
                     select sequence.Count() < 2 ? TimeSpan.FromSeconds(0) : sequence.Zip( sequence.Skip(1), (o1, o2) => o2.Time - o1.Time).Max();
 
        foreach(TimeSpan md in maxdif.Take(5))
        {
            Console.WriteLine(md.TotalSeconds);
        }
1
2 / 2 / 1
Регистрация: 06.09.2015
Сообщений: 81
15.09.2017, 23:51  [ТС] 8
спасибо! работает
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2017, 23:51
Помогаю со студенческими работами здесь

Найти максимальную разность между соседними членами последовательности
Здравствуйте, есть запрос, который работает правильно(по моему мнению). Тут мне говорят, что в коде...

Найти и напечатать наибольшую разницу по модулю между двумя соседними числами
Дано натуральное число N, за ним последовательность из N действительных чисел. Найти и напечатать...

Для вводимой последовательности целых чисел найти максимальную разность между соседними элементами
1-ая задача: Для вводимой последовательности целых чисел найти максимальную разность между...

Определить максимальную разность между двумя соседними цифрами числа
Написать программу для с++: Дано целое число N. Определить максимальную разность между двумя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru