2

次のデータ構造があります: List myOrders

これは、今日受け取った注文に基づくデータ (以下を参照) のリストです (異なる人が同じアイテムを複数回購入した場合に複製できます)。

Data
{
  string itemName
  double itemQuantiy
  string partName
  double partQuantity
}

例として、リストは入力時に次のようになります。

  itemName   itemQuantity   partName   partQuantity
  A          1              alpha      5
  A          1              beta       2
  A          1              delta      100
  B          1              alpha      17
  B          1              gamma      2000
  A          2              alpha      10
  A          2              beta       4
  A          2              delta      200

上の表からわかるように、アイテム A には 3 つの部分 (アルファ、ベータ、デルタ) があり、アイテム B には 2 つの部分 (アルファ、ガンマ) があり、すべてそれぞれの数量があります。この例では、アイテム A は 2 回注文されました (最初の 3 行)。 1 単位の A の場合は最初の注文、2 単位の A の場合は最後の 3 行です)。

これをユーザーに提示する必要がありますが、アイテムごとにグループ化し、数量を集計する必要があります。

最終結果 (画面上でユーザーに表示される) は次のようになります。

  itemName   itemQuantity   partName   partQuantity
  A          3              alpha      15
                            beta       6
                            delta      300
  B          1              alpha      17
                            gamma      2000

これは、LINQ のようなもの、または WPF の何かを使用して行うことができますか? (またはあなたが提案する他の方法-私は今途方に暮れています)。

4

2 に答える 2

5

これがLinqの方法です。

List<Data> myOrders = GetList();

IEnumerable<Data> groupingQuery = myOrders
  .GroupBy(data => new { data.itemName, data.partName } )
  .Select(g => new Data()
  {
    itemName = g.Key.itemName,
    partName = g.Key.partName,
    itemQuantity = g.Sum(x => x.itemQuantity),
    partQuantity = g.Sum(x => x.partQuantity)
  })
  .OrderBy(data => data.itemName)
  .ThenBy(data => data.partName);

または、データをアイテムとパーツに変換することもできます...

List<Item> items = (
  from data in myOrders
  group data by data.itemName into itemGroup
  let partGroups = itemGroup.GroupBy(x => x.partName)
  select new Item()
  {
    itemName = itemGroup.Key,
    itemQuantity = partGroups.Min(partGroup => partGroup.Sum(x => x.itemQuantity)),
    Parts = (
      from partGroup in partgroups
      select new Part() { partName = partGroup.Key, partQuantity = partGroup.Sum(x => x.partQuantity) }
    ).ToList();
  }).ToList();

ここには、このグループ化をより困難にする、矛盾する可能性のあるデータがいくつかあります。

itemName   itemQuantity   partName   partQuantity
A          1              alpha      5
A          2              beta       2
A          1              delta      100

A は 1 つですか、それとも 2 つですか?

于 2013-01-16T19:37:26.730 に答える
0

LINQ GroupBy メソッドを使用できます ( http://msdn.microsoft.com/ru-ru/library/system.linq.enumerable.groupby.aspx )

このようなもの:

List<Data> data = ...;
var groupedItems = data.GroupBy(d => d.itemName);

WPF の場合、グループ化機能を使用できます (ItemsControl.GroupStyle など。たとえば、データグリッドの場合: http://wpftutorial.net/DataGrid.html#grouping Google でさらにチュートリアルを見つけることができます) 。

于 2013-01-16T19:30:02.523 に答える