私はそのようなアイテムのリストを持っています:
public class Item
{
public int ItemId { get; set; }
public string ItemName { get; set; }
public int ListId { get; set; }
}
1 Test1 1
2 Test2 1
3 Test3 1
4 List 2
5 List2 2
6 Testing 3
7 Testing2 3
8 Testing3 3
ListId
でグループ化し、それらをそれぞれの個別のバケットに配置する方法はありますか。つまり、ListId1
バケットにはListId == 1
のすべてのアイテムが含まれます。リストはSQLから動的に返されるため、ListId
がいくつあるかは事前にはわかりません。
GroupBy を使用できます:
var groups = items.GroupBy(item => item.ListId);
foreach(var group in groups)
{
Console.WriteLine("List with ID == {0}", group.Key);
foreach(var item in group)
Console.WriteLine(" Item: {0}", item.ItemName);
}
アイテムのリストを作成しましょう:
List<Item> items = new List<Item>();
items.Add(new Item() { ItemId = 1, ItemName = "Test1", ListId = 1 });
items.Add(new Item() { ItemId = 2, ItemName = "Test2", ListId = 1 });
items.Add(new Item() { ItemId = 3, ItemName = "Test3", ListId = 1 });
items.Add(new Item() { ItemId = 4, ItemName = "List", ListId = 2 });
items.Add(new Item() { ItemId = 5, ItemName = "List2", ListId = 2 });
items.Add(new Item() { ItemId = 6, ItemName = "Testing", ListId = 3 });
items.Add(new Item() { ItemId = 7, ItemName = "Testing2", ListId = 3 });
items.Add(new Item() { ItemId = 8, ItemName = "Testing3", ListId = 3 });
var groupByResult = items.GroupBy(i => i.ListId);
このGroupBy
呼び出しの後、groupByResult
はタイプIEnumerable<IGrouping<int, Item>>
の変数であり、基本的には IGrouping
インターフェイスを実装するオブジェクトのコレクションです。これにより、IGrouping
はIEnumerable<>
から派生し、Key
という名前の追加フィールドがあるため、すべてのアイテムを反復処理できます。
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable
{
TKey Key { get; }
}
簡単に言うと、GroupBy
メソッド呼び出しはリストのリストを返します。外側のリストは、質問で述べた「バケット」に対応しています。次に、各「バケット」には、その「バケット」に対応するアイテムが含まれます。あなたの例に具体的に言うと、groupByResult
の値は this スクリーンショットに示されています。ご覧のとおり、最初のコレクションは、それぞれ3、2、3個のアイテムを持つ3つの異なるバケットにグループ化されました。
これらのグループのアイテムへのアクセスに関しては、単純なLINQを使用できます。
List<Item> firstBucketItems = groupByResult.First(i => i.Key == 1).ToList();
List<Item> secondBucketItems = groupByResult.First(i => i.Key == 2).ToList();
List<Item> thirdBucketItems = groupByResult.First(i => i.Key == 3).ToList();
または、すべてのアイテムを繰り返すことができます。
foreach (var itemGroup in groupByResult)
{
int groupKey = itemGroup.Key;
foreach (Item item in itemGroup)
{
// Do whatever...
}
}
IList<Student> studentList = new List<Student>()
{
new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
new Student() { StudentID = 2, StudentName = "Steve", Age = 21 } ,
new Student() { StudentID = 3, StudentName = "Bill", Age = 18 } ,
new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
new Student() { StudentID = 5, StudentName = "Abram" , Age = 21 }
};
var groupedResult = from s in studentList group s by s.Age;
//各グループを繰り返します
foreach (var ageGroup in groupedResult)
{
Console.WriteLine("Age Group: {0}", ageGroup.Key); //Each group has a key
foreach(Student s in ageGroup) // Each group has inner collection
Console.WriteLine("Student Name: {0}", s.StudentName);
}