我在尝试过滤列表时感到头疼,但在网络上找不到答案。老实说,我什至不知道是否有可能实现,但我想应该是。
所以,MyItem 类看起来像这样:
public class MyItem
{
private int _ID1, _ID2, _registeredTime;
private SortedList<DateTime, AnotherItem> _mySortedList;
public int ID1
{
get { return _ID1; }
set { _ID1 = value; }
}
public int ID2
{
get { return _ID2; }
set { _ID2 = value; }
}
public int RegisteredTime
{
get { return _registeredTime; }
set { _registeredTime = value; }
}
public SortedList<DateTime, AnotherItem> MySortedList
{
get { return _mySortedList; }
set { _mySortedList = value; }
}
}
我的目标是仅根据 RegisterTime 获取每对(ID1、ID2(的第一次出现,所以我使用以下代码,它就像一个魅力:
BaseList = ItemsList.OrderBy(x => x.RegisteredTime).ToList();
FilteredList = new List<MyItem>(BaseList.GroupBy(x => new { x.ID1, x.ID2 })
.Select(x => x.First())).ToList());
但是另一个约束使我需要获取基于第一对(ID1,ID2(+ MySortedList.Key的列表,因此我可以得到类似以下内容:
ID1, ID2, MySortedList[Date1]
ID1, ID2, MySortedList[Date2]
所以我想有一个请求:
FilteredList = BaseList.GroupBy(x => new { x.ID1, x.ID2, x.MySortedList."UniqueKey" })
.Select(x => x.First()))
.ToList();
但是我找不到实现这一目标的解决方案。我对 Linq 有点陌生,不知道这种特殊性是如何工作的(而且,正如我之前所说,如果可能的话(。
感谢您的帮助!
首先按键对项目进行分组,按RegisteredTime
对每组的项目进行排序,最后只检索每组中的第一个项目:
var result = BaseList.GroupBy(x => new { x.ID1, x.ID2, x.MySortedList[yourKey]})
.Select(g => g.OrderBy(i => i.RegisteredTime).First());
请注意,如果尝试按集合中不存在的键进行分组,将出现以下异常:"The given key was not present in the dictionary."
若要应对这种情况,请使用TryGetValue
并确定要对没有该键的项目执行的操作。
此外,不要显式实现属性,因为它们都使用默认实现,请使用 auto-property:
public class MyItem
{
public int ID1 { get; set; }
public int ID2 { get; set; }
public int RegisteredTime { get; set; }
public SortedList<DateTime, AnotherItem> MySortedList { get; set; }
}