明示的に指定しませんが、copyFromは、IEnumerableを実装するクラスDataTableのオブジェクトです。
MSDN System.Data.DataTableによれば、クラスはそれを実装していません。
IEnumerable<DataRow> rows = copyFrom.Rows.Cast<DataRow>()
いますが、違うのDataTableクラスを使用する場合、あなたはおそらくシーケンスにキャストに似た何かをやる:あなたは、そのクラスを使用する場合は、IEnumerableを実装した行のコレクションを返し、プロパティの行を必要としますDataRowの
System.Data.DataRowクラスのオブジェクトには、行内の列にアクセスするための項目プロパティがあります。あなたの場合、列名はoid、idate、amountです。あなたは上の処理をしたい項目の順序にごcopyFromを変換するには
は次のとおりです。
var itemsToProcess = copyFrom.Rows.Cast<DataRow>()
.Select(row => new
{
Oid = row["oid"],
Date = (DateTime)row["idate"],
Amount = (decimal)row["amount"],
});
私はわからないんだけど、私は列IDATEは、日付とカラム量は、いくつかの値が含まれて含まれていることを前提としています。列に他のタイプが含まれている場合は、他のタイプを自由に使用してください。
あなたの列が文字列が含まれている場合は、解析を使用して、適切な項目に変換:あなたはラムダ式に慣れていない場合
var itemsToProcess = copyFrom.Rows.Cast<DataRow>()
.Select(row => new
{
Id = (string)row["oid"],
Date = DateTime.Parse((string) row["idate"]),
Amount = Decimal.Parse (string) row["amount"]),
});
。次のようにそれを読むために私をたくさん助けた:
itemsToProcessは、各行から、このコレクションでは、我々は3つのプロパティを持つ新しい オブジェクト作成 でDataRowのコレクションから取られたアイテムのコレクション、です:同上= ...;データ= ...;金額は= ...
キャスト用
を選択するには、今、我々は日付を比較して金額を合計することができます配列を有します。
このシーケンスのすべてのアイテムを、同じIDと日付のグループにグループ化します。ですから、Id = 00045とDate = 02/13/2011のグループとId = 00045とdate =、02/14/2011のグループが必要です。
この場合、Enumerable.GroupByを使用してください。セレクタ(=グループ内のすべてのアイテムを共通に持つもの)では、IDと日付の組み合わせを使用します。
var groups = itemsToProcess.GroupBy(item => new
{Id = item.Id, Data = item.Data});
これでグループが作成されました。
- 各グループには、IDとデータの2つのプロパティを持つタイプのプロパティKeyがあります。
- 各グループ一つのグループ内のすべての項目は、同じIDと同じデータを持っている
- (それは、ID /データ/値のプロパティを持つ「itemToprocess」である)あなたのitemsToProcessコレクションから項目の順序されます。
あなたがしなければならないことは、各グループのシーケンスのすべての要素を合計することだけです。
var resultSequence = groups.Select(groupItem => new
{
Id = groupItem.Key.Id
Date = groupItem.Key.Date,
Sum = groupItem.Sum(itemToProcess => itemToProcess.Value,
}
だから、1つの文にすべて一緒にそれを置く:
var resultSequence = copyFrom.Rows.Cast<DataRow>()
.Select(row => new
{
Id = (string)row["oid"],
Date = DateTime.Parse((string) row["idate"]),
Amount = Decimal.Parse (string) row["amount"]),
})
.GroupBy (itemToProcess => new
{
Id = item.Id,
Data = item.Data
});
.Select(groupItem => new
{
Id = groupItem.Key.Id
Date = groupItem.Key.Date,
Sum = groupItem.Sum(itemToProcess => itemToProcess.Value,
});
は、私がまさに必要だったこと、ありがとうございます。だから、もし私がoidでそれを注文したいと思ったら、私はselect newの直前でorderbyをやるでしょう。 編集:申し訳ありませんが、それがミニMarkdownだったことを認識していませんでした。 –
これは簡単な方法です: 'result = result.OrderBy(e => new {e.oid、e.idate});' – octavioccl