2012-03-07 7 views
0

で繰り返すアイテムをカウントする:それはこのようなものだのでROOM1、ROOM2、Room3、ROOM1、Room3、また、行のいくつかのデータを:どのように私はデータで埋めdatagridview1コラム持ってDataGridViewの

Name, Time, Room 
name1, 10, Room1 
name2, 44, Room2 
name3, 1, Room3 
name4, 12, Room1 
................. 

何私は思います〜には2倍のRoom1,1倍のRoom2,2倍のRoom3、そして累積時間値を追加することができます。すべてのアイデアはどのようにそれを行うには ..

Room | Cumulative_Time 
------------------------- 
Room1 | 22 
Room2 | 44 

、別のDataGridViewに追加します。

だから、のようになりますか?あなたのデータは、クエリから来る場合

+0

itemsource(Listまたはsmth)のようなものを投稿できますか?また、 _linq_ an option –

答えて

1

...構文のお手伝いをすることはできません。

public List<Room> GetRooms() 
{ 
    return new List<Room>(){new Room(){Name = "Room1", Time= 10}, 
          new Room(){Name = "Room1", Time= 20}, 
          new Room(){Name = "Room2", Time= 10}, 
          new Room(){Name = "Room2", Time= 30}, 
          new Room(){Name = "Room2", Time= 50}, 
          new Room(){Name = "Room4", Time= 25}, 
          new Room(){Name = "Room3", Time= 50}, 
          new Room(){Name = "Room3", Time= 15}, 
          new Room(){Name = "Room3", Time= 30}, 
          new Room(){Name = "Room3", Time= 40}}; 
} 

[TestMethod] 
public void CheckSumsLambda() 
{ 
    var rooms = GetRooms(); 
    var results = rooms.GroupBy(x => x.Name).Select(x => new { RoomName = x.Key, Occurences = x.Count(), Cumulativetime = x.Sum(y => y.Time) }); 

    Console.WriteLine("Lambda flavour"); 
    foreach (var result in results) 
    {     
     Console.WriteLine("{0}x {1} | {2}", result.Occurences, result.RoomName, result.Cumulativetime);    
    } 

} 

[TestMethod] 
public void CheckSumsLinq() 
{ 
    var rooms = GetRooms(); 
    var results = from r in rooms 
        group r by r.Name 
         into g 
         select new { RoomName = g.Key, Occurences = g.Count(), Cumulativetime = g.Sum(y => y.Time) }; 

    Console.WriteLine("Linq flavour"); 
    foreach (var result in results) 
    { 
     Console.WriteLine("{0}x {1} | {2}", result.Occurences, result.RoomName, result.Cumulativetime); 
    } 

} 

出力:

lambda version

linq version

+0

すばらしいコード;)Tnx。私はこのコードを自分のdatagridview値に適合させ、累積時間をtimespanに変換する必要があります。なぜなら、たびにDateTime変数があるからです。 – Elfoc

0

、あなたが部屋のフィールドでグループ化され、時間のsum関数を使用するクエリを使用して第2のグリッドを埋めることができ

SELECT Room, Sum(Time) from data_table group by Room 

したくない場合は/に」 tはあなたがのLINQを使用してそれを行うことができ、SQLクエリを使用しますが、私はあなたがラムダとLINQの味と行くここ

0

あなたのデータソースとしてPOCOSを使用すると仮定すると、これはあなたの問題を解決する必要があります。

// Get data from DataGridView 
var dts = DataGridView.DataSource; 

// Get list of rooms 
var rooms = dts.Select(d=>d.Room).Distinct(); 

// Populate new DataGrid 
NewDataGridView.DataSource = rooms 
.Select(r => new {Room = r, 
Cumulative_Time = dts.Where(d => d.room == r).Select(d => d.time).Sum()}); 
+0

エラー: 'オブジェクト'に '選択'の定義がなく、拡張メソッドがありません 'タイプ'の最初の引数を受け入れる 'オブジェクト'が見つかりました(usingディレクティブまたはアセンブリ参照?):( – Elfoc

+0

DataSourceとして使用しているものにDataSourceをキャストする必要があります。 – Tsabo

関連する問題