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



我在尝试过滤列表时感到头疼,但在网络上找不到答案。老实说,我什至不知道是否有可能实现,但我想应该是。

所以,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; }
}

最新更新