我在尝试过滤List时遇到了麻烦,但无法在网上找到答案。老实说,我甚至不知道是否有可能实现,但我想它应该是。
所以,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; }
}
}
我的目标是只根据RegisteredTime获得每对(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不熟悉并且不知道这种特殊性是如何起作用的(而且,正如我之前所说,如果它甚至可能的话)。
感谢您的帮助!
答案 0 :(得分:1)
首先按键对项目进行分组,按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; }
}