[英]C# select elements from IList
我有一個對象列表, IList<O>
。 O
有幾個屬性,但只有兩個是相關的: Date
和Duration
。
我想將列表“拆分”為幾個列表,這些列表僅包含具有匹配日期和持續時間屬性的對象。
例:
0- Date==1, Duration==7 1- Date==1, Duration==7 2- Date==2, Duration==7 3- Date==2, Duration==7 4- Date==2, Duration==14 5- Date==2, Duration==14
期望的結果(IList <IList <O >>):
0- 0- Date==1, Duration==7 1- Date==1, Duration==7 1- 0- Date==2, Duration==7 1- Date==2, Duration==7 2- 0- Date==2, Duration==14 1- Date==2, Duration==14
我知道這可以通過一些LINQ選擇來完成,但我不確定如何。
您可以使用以下內容:
var query =
from item in list
group item by new { item.Date, item.Duration } into g
select g.toList();
var result = query.toList();
這將創建一個具有您要分組的屬性的匿名類。 然后,它將IGrouping
擴展為原始類型的List
。 然后運行查詢以生成外部List
。
有關嵌套的LINQ結果,請參閱分組運算符 。
以下是我鏈接到的網站的示例:
public void Linq40()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var numberGroups =
from n in numbers
group n by n % 5 into g
select new { Remainder = g.Key, Numbers = g };
foreach (var g in numberGroups)
{
Console.WriteLine("Numbers with a remainder of {0} when divided by 5:", g.Remainder);
foreach (var n in g.Numbers)
{
Console.WriteLine(n);
}
}
}
我正在學習Linq,所以我試圖找到一個解決方案:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace so_listobj
{
class Program
{
static void Main(string[] args)
{
List<O> anOList = new List<O>();
List<List<O>> aGroupOList = new List<List<O>>();
anOList.Add(new O(1, 7));
anOList.Add(new O(1, 7));
anOList.Add(new O(2, 2));
anOList.Add(new O(2, 2));
anOList.Add(new O(2, 14));
anOList.Add(new O(2, 14));
Console.Out.WriteLine("Initial state");
foreach (O o in anOList)
{
Console.Out.WriteLine(o);
}
var grp =
from o in anOList
group o by o.Date into a
select new {Date = a.Key, aGroupOList = a };
Console.Out.WriteLine("after grouping");
foreach (var _ob in grp)
{
foreach (var _anotherOList in _ob.aGroupOList)
{
Console.Out.WriteLine("{0} {1}", _ob.Date, _anotherOList.ToString());
}
}
}
}
class O
{
private int _Odate;
private int _Oduration;
public O(int date, int duration)
{
_Odate = date;
_Oduration = duration;
}
public int Date
{
get { return _Odate; }
set { _Odate = value; }
}
public int Duration
{
get { return _Oduration; }
set { _Oduration = value; }
}
public override String ToString()
{
return String.Format("- Date :{0}\t Duration:{1}", _Odate, _Oduration);
}
}
}
這將為您提供IEnumerable<IGrouping<Date, O>>
,它接近您想要的。
list.GroupBy(i => new { Date = i.Date, Duration = i.Duration });
要獲得實際的IList<IList<O>>
,您必須通過從IGrouping
獲取IEnumerable<O>
來進一步改進:
list.GroupBy(i => new { Date = i.Date, Duration = i.Duration })
.Select(g => g.ToList()).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.