2

私は現在、理解できないような小さな機能に困惑しています。

まずStock、次のようなクラスがあります。

public class Stock
{
    public int Id;
    public int LocationId;
    public int Quantity;
}

Stockログは、別の機能から生成されたデータベースから返されます。ログはコレクションとして表されますが、同じ組み合わせの各オブジェクトのプロパティList<Stock>を追加する必要があります。次に例を示します。QuantityIDLocationID

元のデータセット:

ID:1場所:1数量:20

ID:1場所:2数量:30

ID:1場所:1数量:30

ID:2場所:2数量:20

ID:1場所:2数量:30

ID:1場所:1数量:100

戻る必要があります:

凝縮されたデータセット:

ID:1場所:1数量:150

ID:1場所:2数量:60

ID:2場所:2数量:20

ID繰り返しになりますが、データセットはデータベースから動的に返されます。すべての&の組み合わせがあるという保証はありませんLocationID。結果のデータセットは、との複合キーで一意である必要がIDありLocationIDます。

これを実行するための最も効果的な方法がわからず、プロジェクトの進捗が妨げられているため、アドバイスやアプローチをいただければ幸いです。これは本当に知識のギャップだと思いますが、自分の要件に合う適切なものを見つけることができませんでした(これはかなり奇妙な要件だと思います)。

どうもありがとう、

アンディ

4

4 に答える 4

2

データベースでこれを行う方が良いでしょうが、GroupByを使用してまったく同じ効果を達成することもできます。

public class Stock
{
    public int Id;
    public int LocationId;
    public int Quantity;
}

static void Main(string[] args)
{
    var list = new List<Stock>()
        {
            new Stock(){ Id = 1, LocationId = 1, Quantity = 20},
            new Stock(){ Id = 1, LocationId = 2, Quantity = 30},
            new Stock(){ Id = 1, LocationId = 1, Quantity = 30},
            new Stock(){ Id = 2, LocationId = 2, Quantity = 20},
            new Stock(){ Id = 1, LocationId = 2, Quantity = 30},
            new Stock(){ Id = 1, LocationId = 1, Quantity = 100},

        };

    var grouped = list.GroupBy(c => new {Id = c.Id, LocationId = c.LocationId})
            .Select(g => new 
                 { 
                      Id = g.Key.Id, 
                      LocationId = g.Key.LocationId, 
                      Quantity = g.Sum(a => a.Quantity) 
                  });
    foreach(var group in grouped.OrderBy(c => c.Id))
    {
        Console.WriteLine("Id:{0} - LocationId:{1} - Quantity:{2}", group.Id, 
                 group.LocationId, group.Quantity);
    }
}
于 2013-02-13T18:13:16.553 に答える
2

これを行うために使用GroupByします:

var grouped = (from s in stocks
                group s by new { s.Id, s.LocationId }
                    into grp
                    select new Stock()
                    {
                        Id = grp.Key.Id,
                        LocationId = grp.Key.LocationId,
                        Quantity = grp.Sum(x => x.Quantity)
                    }).ToList();
于 2013-02-13T18:05:44.963 に答える
1

私は次のようなSQLクエリを使用することを好みます:

select id, location, sum(quantity) quant from stocktable group by id, location

これは、パフォーマンスの観点から、データベース自体で計算を実行するのに役立ちます。DBサーバーはとにかくすべてのデータを読み取ってアプリ層に提供するため、パフォーマンスの低下はなく、単純さの点でメリットがあります。

于 2013-02-13T18:19:46.290 に答える
0

を使用Enumerable.GroupByしてグループ化を実行し、Enumerable.Aggregate(またはこの場合は特殊化Sumして)集計を実行できます。

次のようなもの:

IEnumerable<Tuple<int, int, int>> result =
    stocks.GroupBy(stock => new { id = stock.Id, locationId = stock.LocationId},
                   (key, s) => new { key.id, key.locationId, total = s.Sum(ss => ss.Quantity) });

foreach (var result in results)
{
    Console.WriteLine(result.id);
    Console.WriteLine(result.locationId);
    Console.WriteLine(result.total);
}
于 2013-02-13T18:03:59.157 に答える