2010-08-24 19 views
7

एक मनमाना समय मैं एक आइटम वर्ग इस तरह परिभाषित किया गया की एक IEnumerable है द्वारा:समूह दिनांक समय अंतराल

public class Item { 
    public DateTime Date { get; private set; } 
    public decimal? Value { get; private set; } 

    public Item(DateTime date, decimal? value) { 
    Date = date; 
    Value = value; 
    } 
} 

इन मदों एक विशिष्ट समय अंतराल (उदाहरण के लिए 5 मिनट) में हैं। मुझे तारीख तक उन्हें समूहित करने की जरूरत है, लेकिन अंतराल को बदलना है। उदाहरण के लिए, यदि आइटम निम्न क्रम में हैं:

2010-08-24 00:05 
2010-08-24 00:10 
2010-08-24 00:15 
2010-08-24 00:20 
2010-08-24 00:25 
2010-08-24 00:30 

और मैं उन्हें एक 15 मिनट के अंतराल में समूह चाहते हैं, परिणाम इस तरह दिखना चाहिए:

2010-08-24 00:15 
2010-08-24 00:30 

अंतराल द्वारा प्रदान की जाती है एक और वर्ग, लेकिन मैं मिलीसेकंड प्राप्त कर सकता हूं जो उस अंतराल का प्रतिनिधित्व करते हैं (उदाहरण के लिए, अंतराल। फ्रॉममिन्यूट्स (5)। गेटमिलिसेकंड() 300000 वापस आना चाहिए)। सवाल यह है कि मैं एक समूह कार्य कैसे लिख सकता हूं जो मुझे ऐसा कुछ करने की अनुमति देता है: data = items.GroupBy(t => GroupingFunction(t.DateTime, interval)) और वह परिणाम प्राप्त करें?

अद्यतन: अंतराल मिनटों में आवश्यक नहीं होगा। यह घंटों, मिनटों या यहां तक ​​कि दिनों में हो सकता है।

+0

आप चाहते समूहन या छनन (अपने उदाहरण के रूप में)? –

+0

ग्रुपिंग। उदाहरण में 00:05, 00:10 और 00:15 00:15 बन गया (मैं तीन वस्तुओं के मानों को समेटूंगा और 00:15 टाइमस्टैम्प रखूंगा)। – Fernando

उत्तर

7

ऐसा कुछ?

 DateTime[] dateTimes = new[] 
            { 
             new DateTime(2010, 8, 24, 0, 5, 0), 
             new DateTime(2010, 8, 24, 0, 10, 0), 
             new DateTime(2010, 8, 24, 0, 15, 0), 
             new DateTime(2010, 8, 24, 0, 20, 0), 
             new DateTime(2010, 8, 24, 0, 25, 0), 
             new DateTime(2010, 8, 24, 0, 30, 0) 
            }; 
     TimeSpan interval = new TimeSpan(0, 15, 0);  // 15 minutes. 

     var groupedTimes = from dt in dateTimes 
          group dt by dt.Ticks/interval.Ticks 
          into g 
          select new {Begin = new DateTime(g.Key*interval.Ticks), Values = g.ToList()}; 

     foreach (var value in groupedTimes) 
     { 
      Console.WriteLine(value.Begin); 
      Console.WriteLine("\t{0}", String.Join(", ", value.Values)); 
     } 
0

क्या आपने मॉड्यूलस द्वारा समूहबद्ध करने का प्रयास किया है?

Untested धारा के- चेतना स्यूडोकोड इस प्रकार है:

data = items.GroupBy(t => t.TimeInterval % 15 == 0); 
1
data = items.GroupBy(t => (int)(t.DateTime.Minutes/interval))) 
+0

यह केवल तभी काम करेगा जब तक अंतराल 60 मिनट से कम न हो। – driis

संबंधित मुद्दे