C#Linq OrderBy Object.ID&& Object.SortedList.Key.Value

时间:2018-01-09 17:44:21

标签: c# linq sql-order-by sortedlist

我在尝试过滤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不熟悉并且不知道这种特殊性是如何起作用的(而且,正如我之前所说,如果它甚至可能的话)。

感谢您的帮助!

1 个答案:

答案 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; }
}