2010-08-31 88 views
0

我有表下面的字段需要,幫助用C#邏輯

table Shows, 
    Id Name Time 
    1  A 7/28/2010 11:15:00 AM 
    2  B 7/29/2010 8:50:00 AM 
    3  C 7/29/2010 8:55:00 AM 

我有具有從所有的字段數據的對象顯示。現在,我想有一個UI, 顯示所有天以小時爲單位顯示的數..

Date 7/28/2010 
    Hours Count 
    11-12 1 

Date 7/29/2010 
    Hours Count 
    8-9 2 

我不知道我應如何在C#中做到這一點(它的邏輯。)此外,有沒有像C#中的php那樣的爆炸函數。因爲我的數據庫字段有價值 7/29/2010 8:55:00上午,我想打破日期和時間。任何人都可以幫助建立上述用戶界面的邏輯?

因爲我想要顯示每個日期的所有小時數和他們的計數,我必須使用列表框中的日期和另一個列表框中的所有時間和計數在那個日期嗎?你能告訴我怎麼做?

+0

什麼數據庫?你在使用LINQ產品還是數據集? – 2010-08-31 16:22:18

+0

這是更多的SQL問題或LINQ問題,而不是C#問題。根據Brian的評論,您使用的是什麼類型的數據訪問? – 2010-08-31 16:31:00

+0

對於我來說,這不是一個SQL問題,因爲應用程序使用NHibernate獲取數據,而這些數據都是由其他人設計的。所以我可以做的是獲取數據,然後使用C#以需要的方式顯示和分解它。 – developer 2010-08-31 17:04:58

回答

4

假設你能夠使用LINQ,那麼你可以很容易地在C#中完成所有的分組和排序。 (我假設只是一個DateTime對象列表而不是完整的Show對象 - 看起來你可以用一個簡單的LINQ Select語句獲得每個Show的DateTime。)

var shows = new[] 
      { 
       new DateTime(2010, 7, 28, 11, 15, 0), 
       new DateTime(2010, 7, 29, 8, 50, 0), 
       new DateTime(2010, 7, 29, 8, 55, 0) 
      }; 

var dates = shows.GroupBy(d => d.Date).OrderBy(d => d.Key); 
foreach (var date in dates) 
{ 
    Console.WriteLine("Date {0}", date.Key.ToShortDateString()); 
    var hours = date.GroupBy(d => d.Hour).OrderBy(d => d.Key); 
    Console.WriteLine("\tHours\tCount"); 
    foreach (var hour in hours) 
     Console.WriteLine("\t{0}-{1}\t{2}", hour.Key, (hour.Key+1)%24, hour.Count()); 
} 

這提供了輸出:

Date 7/28/2010 
     Hours Count 
     11-12 1 
Date 7/29/2010 
     Hours Count 
     8-9  2 

注意,這只是一個簡單的控制檯應用程序的例子。您尚未指定您使用的是什麼GUI技術(WinForms,WPF),因此我將其留作練習,以便將分組結果應用到GUI中。

編輯:這是XAML中使用嵌套的ItemsControls和DataBinding轉換爲LINQ語句的示例格式。

<ItemsControl Name="ShowDates" ItemsSource="{Binding}"> 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <HeaderedContentControl HeaderStringFormat="Date: {0}"> 
      <HeaderedContentControl.Header> 
       <StackPanel> 
        <TextBlock Text="{Binding Path=DateString, StringFormat='Date: {0}'}" /> 
        <TextBlock Margin="20,1,1,1" Text="Hour : Shows"/> 
       </StackPanel> 
      </HeaderedContentControl.Header> 
      <ItemsControl Name="HoursList" Margin="20,1,1,1" ItemsSource="{Binding Path=Hours}"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <TextBlock> 
          <TextBlock.Text> 
           <MultiBinding StringFormat="{}{0}-{1} : {2}"> 
            <MultiBinding.Bindings> 
             <Binding Path="HourStart" /> 
             <Binding Path="HourEnd" /> 
             <Binding Path="Count" /> 
            </MultiBinding.Bindings> 
           </MultiBinding> 
          </TextBlock.Text> 
         </TextBlock> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </HeaderedContentControl> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 
</ItemsControl> 

這使用我的原始LINQ語句的修改版本,以使DataBinding更容易連線。這段代碼在我的測試窗口的構造函數中。

var result = 
    shows 
    .GroupBy(d => d.Date) 
    .Select(gp => new{ 
     Date = gp.Key, 
     DateString = gp.Key.ToShortDateString(), 
     Hours = gp.GroupBy(d => d.Hour) 
        .Select(hgp => new { 
         HourStart = hgp.Key, 
         HourEnd = (hgp.Key + 1) % 24, 
         Count = hgp.Count() 
        }) 
        .OrderBy(h => h.HourStart) 
    }); 
ShowDates.DataContext = result; 
+0

不,我可以只使用NHibernate.No LINQ .. – developer 2010-08-31 17:46:55

+0

您將使用NHibernate從數據庫加載數據。一旦數據加載到顯示對象中,您就可以使用LINQ到對象來進行分組和排序。 – mjeanes 2010-08-31 18:16:42

+0

如果你在對象(集合或數組)中有數據,就同意mjeanes,那麼你可以直接使用linq來創建分組和計數,如上所示。 – Mark 2010-08-31 20:27:56

3

大多數數據庫都具有轉換功能。例如,像SQL Server一樣,您可以轉換日期並對其進行格式化,使其在convert關鍵字中顯示爲7/29/2010。此外,可以使用SQL中的datepart函數提取第一個小時(您必須通過加上一個小時來計算第二個小時,除非小時爲12,然後返回1,這可以通過函數完成)。

因此,按日期組,然後按小時範圍,然後計算出現次數......是邏輯。

HTH。

+0

爲什麼不在C#端修改它,在那裏有一個很好的DateTime類? – CaffGeek 2010-08-31 16:41:26

2

至於你的日期時間的問題,因爲7/29/2010 8:55:00 AM是有效的日期時間,你可以用解析

System.DateTime dateTime; 
System.DateTime.TryParse("7/29/2010 8:55:00 AM", out dateTime); 
var date = dateTime.Date; 
var time = dateTime.TimeOfDay; 

其他各種屬性和方法是可用的。如果你只是想串您可以使用

var timeString = dateTime.ToString("hh:mm"); 

在C#中,你真的很少需要做的字符串操作,如果您使用的是「正常」的類型,如日期,數字,時間數據等

+0

你可以幫助我的用戶界面。因爲我想顯示每個日期的所有時間和他們的計數,我必須使用日期列表框和另一個列表框中的所有時間和計數,你能告訴我該怎麼做嗎? – developer 2010-08-31 17:23:13

0

你的SQL聲明可用於將數據分解爲分組。例如,這裏的SQL語句,我會使用(你在第一列看到怪異的分析僅僅是我從一個DateTime對象丟棄時的樣子):

SELECT 
    CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, DateTimeColumnName))) as [Date], 
    DATEPART(Hour, DateTimeColumnName) as [Hour], 
    Count(*) as [Count] 
FROM Shows 
GROUP BY 
    FLOOR(CONVERT(FLOAT, DateTimeColumnName)), 
    DATEPART(Hour, DateTimeColumnName) 

這將返回您包含一個數據集日期,一小時,以及有多少條記錄符合該條件。喜歡的東西:

[Date]    [Hour]  [Count] 
7/28/2010 00:00:00 11   1 
7/29/2010 00:00:00 8   2 

只要看看這些數據,並對其進行格式化,但是你想在你的UI。

關於您的其他問題,DateTime對象包含不同時間部分的屬性,所以只需將您的日期時間數據轉換爲像Chad建議的那樣的DateTime對象。

+0

你可以幫助我的用戶界面。因爲我想顯示每個日期的所有時間和他們的計數,我必須使用日期列表框和另一個列表框中的所有時間和計數,你能告訴我該怎麼做嗎? – developer 2010-08-31 17:24:18