2017-06-18 2 views
1

Comment implémenter l'itération avec plusieurs types de membres de données?IEnumerable avec plusieurs membres de données

Ceci est l'interface que je dois avoir mis en œuvre

interface ISeries : IReadOnlyList<Tuple<DateTime, double>> 
{ 
    IEnumerable<DateTime> Time { get; } 
    IEnumerable<double> Values { get; } 
} 

Classe de mon objet personnalisé avec DateTime et double en elle

class TimeEvent 
{ 
    public DateTime Time; 
    public double Value; 
    public TimeEvent(DateTime time, double value) 
    { 
     Time = time; 
     Value = value; 
    } 
} 

Classe de ma série personnalisée en TimeEvents

class TimeSeries : ISeries 
{ 
    List<TimeEvent> TimeEvents; 

    public TimeSeries(List<TimeEvent> timeEvents) 
    { 
     TimeEvents = timeEvents; 
    } 

    public Tuple<DateTime, double> this[int index] 
    { 
     get 
     { 
      return new Tuple<DateTime, double>(TimeEvents[index].Time, TimeEvents[index].Value); 
     } 
    } 

    public int Count 
    { 
     get 
     { 
      return TimeEvents.Count; 
     } 
    } 

    public IEnumerable<DateTime> Time 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public IEnumerable<double> Values 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public IEnumerator<Tuple<DateTime, double>> GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return TimeEvents.GetEnumerator(); 
    } 
} 

Et voici essentiellement ce que j'essaie de l'utiliser. Donc, je peux itérer des éléments de Trought dans TimeSeries. Un peu comme dans le dictionnaire.

class Program 
{ 
    static void Main() 
    { 
     TimeEvent t1 = new TimeEvent(new DateTime(2017, 1, 1), 64); 
     TimeEvent t2 = new TimeEvent(new DateTime(2017, 2, 3), 128); 
     TimeEvent t3 = new TimeEvent(new DateTime(2017, 3, 6), 256); 
     List<TimeEvent> list = new List<TimeEvent>(); 
     list.Add(t1); 
     list.Add(t2); 
     list.Add(t3); 
     TimeSeries series = new TimeSeries(list); 

     foreach(DateTime date in series.Time) 
      Console.WriteLine(date); 

     foreach (double d in series.Values) 
      Console.WriteLine(d); 
    } 
} 

Répondre

2
... 
List<TimeEvent> TimeEvents; 

public TimeSeries(List<TimeEvent> timeEvents) 
{ 
    TimeEvents = timeEvents; 
} 

public IEnumerable<DateTime> Time 
{ 
    get 
    { 
     foreach (var item in TimeEvents) 
     { 
      yield return item.Time; 
     } 
    } 
} 

public IEnumerable<double> Values 
{ 
    get 
    { 
     foreach (var item in TimeEvents) 
     { 
      yield return item.Value; 
     } 
    } 
} 
+2

Ou juste public IEnumerable Heure => TimeEvents.Select (x => x.Time); et public IEnumerable Valeurs => TimeEvents.Select (x => x.Value); – ckuri

+0

ckuri oui c'est encore mieux, thnx – Universus

1

Would quelque chose de simple travail pour vous?

List<Tuple<DateTime, double>> list = new List<Tuple<DateTime, double>>(); 
list.Add(Tuple.Create(new DateTime(2017, 1, 1), 64d)); 
list.Add(Tuple.Create(new DateTime(2017, 2, 3), 128d)); 
list.Add(Tuple.Create(new DateTime(2017, 3, 6), 256d)); 

foreach (Tuple<DateTime, double> tuple in list) 
{ 
    Console.WriteLine("DateTime={0:yyyy/dd/mm}, Double={1}", tuple.Item1, tuple.Item2); 
} 

Semble working.

+0

Tuple est bon pour ça, je l'utiliserais mais je dois implémenter cette interface. Quoi qu'il en soit. J'ai aussi plus de membres, donc ce serait chaotique. – Universus