2017-06-18 6 views
1

多くのタイプのデータメンバーを反復処理する方法は?複数のデータメンバーを持つIEnumerable

これは私が

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

のDateTimeと私のカスタムオブジェクトのクラスとのダブル実装している必要がありますインターフェイスであることTimeEventsで作られた私のカスタムシリーズの

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

クラス

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

これを基本的に使ってみようとしています。だから、私はTimeSeriesで動かすアイテムを繰り返すことができます。辞書のように。

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

答えて

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

またはちょうど 公開IEnumerable 時間=> TimeEvents.Select(x => x.Time);および public IEnumerable 値=> TimeEvents.Select(x => x.Value); – ckuri

+0

ckuriはいそれはさらに良いです、thnx – Universus

1

う何か単純なあなたのために動作しますか?

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

と思われます。workingです。

+0

タプルこれには良いです、私はそれを使用するが、私はそのインターフェイスを実装する必要があります。とにかくthnx。私もメンバーが増えて混乱しています。 – Universus

関連する問題