3

私はLinqが初めてです。これが最善の方法なのか、それとも他の方法があるのか​​知りたいです。

Web サービスからアイテムのリストを受け取るという要件があります。

class Item {

  string ItemName { get; set;} 
  string GroupName { get; set; }
}

次のデータを受け取ります。

ItemName: Item1; GroupName: A
ItemName: Item2; GroupName: B
ItemName: Item3; GroupName: B
ItemName: Item4; GroupName: A
ItemName: Item5; GroupName: A

ここで、リスト内の一意のグループをすべて取得し、すべての項目をそのグループに関連付けたいと考えています。だから私はクラスを作りました:

class Group {
   string GroupName { get; set; }
   List<string> Items { get; set; }
}

単一のグループがあり、関連するすべてのアイテムがリストの下にあるようにします。

2 つの LINQ ステートメントを作成しました。

var uniqueGroups = (from g in webservice
        where g.Group != null
        select g.GroupName).Distinct();

それから私はそれをループします

foreach (var gn in uniqueGroups)
{
   var itemsAssociated = (from item in webservice 
                          where item.GroupName = gn.ToString()
                          select new {
                               });
}

アイテムを取得し、オブジェクトに保存します。

これはこれを行うための最良の方法ですか、またはこれらすべてを一度に実行できるLINQステートメントはありますか?

ありがとう。

4

4 に答える 4

6

GroupByが必要なようです

var itemsByGroup = items.GroupBy(i => i.GroupName);

foreach (var group in itemsByGroup)
{
    var groupName = group.Key;
    var itemsForThisGroup = group;

    foreach (var item in itemsForThisGroup)
    {
        Console.Out.WriteLine(item.ItemName);
    }
}
于 2012-06-29T10:47:17.443 に答える
4

これを試すことができます:

//List<Item> webservice = list with items from your webservice
var result = (from i in items
              group i by i.GroupName into groups
              select new Group()
              {
                  GroupName = groups.Key,
                  Items = groups.Select(g => g.ItemName).ToList()
              }).ToList();
于 2012-06-29T10:46:03.470 に答える
1

私は使うだろう:

 webservice.ToLookup(k => k.GroupName);

これにより、余分なクラスが不要になります。

お役に立てれば!

于 2012-06-29T10:52:58.390 に答える
1

これは、匿名型とを使用して一度に行うことができますEnumerable.GroupBy

var groupItems =
    webservice.Where(i => i.GroupName != null)
              .GroupBy(i => i.GroupName)
              .Select(grp => new { Group = grp.Key, Items = grp.ToList() });
foreach (var groupItem in groupItems)
    Console.WriteLine("Groupname: {0} Items: {1}"
        , groupItem.Group
        , string.Join(",", groupItem.Items.Select(i => i.ItemName)));

常にグループを区別するため、区別は役に立ちGroupByません。それがグループの性質です。

実行中のコードは次のとおりです: http://ideone.com/R3jjZ

于 2012-06-29T10:50:59.310 に答える