0

次の列を持つデータテーブルがあります

CallTime   CallType

15:45:00    Voice
15:30:54    Voice
00:12:14    SMS
01:13:47    Voice
05:48:23    SMS
12:00:47    Voice

今私が欲しいのは、このようなLinq結果を使用することです

Hrs   Count
00    1
01    1
05    1
12    1
15    2

Linq を使用してグループ化を試みましたが、うまくいきません。

次のコードを使用しました

   var groupQuery = from table in Foundrows.AsEnumerable()
                         group table by table["Call Time"] into groupedTable
                         select new
                         {
                             CallTime = groupedTable.Key,
                             CallCount = groupedTable.Count()
                         };
4

2 に答える 2

2

時間ごとにグループ化したい場合、フィールド "Call Time" はDateTimeフィールドです:

var groupQuery = from row in Foundrows.AsEnumerable()
                 let hour = row.Field<DateTime>("Call Time").Hour 
                 group row by hour into hourGroup
                 select new {
                    CallHour = hourGroup.Key,
                    CallCount = hourGroup.Count()
                 }; 

Date+の組み合わせでグループ化する場合Hour:

var groupQuery = from row in Foundrows.AsEnumerable()
                 let date = row.Field<DateTime>("Call Time")
                 let hour = date.Hour
                 group row by new{ date, hour } into dateHourGroup
                 select new {
                     CallDate = dateHourGroup.Key.date,
                     CallHour = dateHourGroup.Key.hour,
                     CallCount = dateHourGroup.Count()
                 }; 

編集:それが実際にTimeSpan(そうであるように)である場合は、lazyberezovskyのアプローチを使用してください:)

あなたのコメント:TryParseの代わりに使用したい場合Parse、コードにどのような変更を加える必要がありますか?

を返すことができる拡張機能を作成することをお勧めしますNullable<TimeSpan>。次に、次のことを確認できますHasValue==true

public static TimeSpan? TryGetTimeSpan(this string tsString, string format = null)
{
    TimeSpan ts;
    bool success;
    if (format == null)
        success = TimeSpan.TryParse(tsString, out ts);
    else
        success = TimeSpan.TryParseExact(tsString, format, null, TimeSpanStyles.None, out ts);
    return success ? (TimeSpan?)ts : (TimeSpan?)null;
} 

これで、このクエリは効率的に機能し、文書化されていない副作用を (クエリでTimeSpan使用するローカル変数として) 使用しなくなりました。TimeSpan.TryParse

var groupQuery = from r in Foundrows.AsEnumerable()
                 let time = r.Field<string>("CallTime").TryGetTimeSpan()
                 where time.HasValue
                 group r by time.Value.Hours into g
                 select new
                 {
                     Hrs = g.Key,
                     CallCount = g.Count()
                 };
于 2013-04-16T07:04:04.797 に答える