代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

如何使用LINQ返回包含列表中最新项的列表

  •  1
  • Edward Tanguay  · 技术社区  · 7 年前

    我有以下元组列表:

    var allXmlUsers = new List<(string login, string email, string createdOn)>();
    allXmlUsers.Add(("thompson", "sdfsd@dkfjdkf.com", "2015-03-04 20:32:04"));
    allXmlUsers.Add(("dupont", "asdfdfd@dkfjdkf.com", "2017-03-04 20:32:04"));
    allXmlUsers.Add(("james", "dfsdfs33@dkfjdkf.com", "2016-03-04 20:32:04"));
    

    我想换成 List<> 只有最新的项目,例如“杜邦”。

    我可以返回一个元组对象,如下所示:

    var single = (from x in allXmlUsers orderby x.createdOn descending select x).FirstOrDefault();
    

    我还回了一个 列表& lt; 重新排序如下:

    var list = from x in allXmlUsers orderby x.createdOn descending select x;
    

    但是我该怎么还 列表& lt; 只包含一个元组,即最近的元组,类似于这样?

    //allXmlUsers = ((from x in allXmlUsers orderby x.createdOn descending select x).FirstOrDefault()).ToList();
    //(error: cannot resolve symbol to List)
    
    2 回复  |  直到 7 年前
        1
  •  7
  •   Titian Cernicova-Dragomir    7 年前

    你可以使用 Take 方法只从可枚举项中获取1个元素。

    var single = (from x in allXmlUsers orderby x.createdOn descending select x)
                 .Take(1)
                 .ToList();
    

    编辑

    上面的代码片段将返回一个空列表(长度为0的列表之一),这可能是所需的行为,但您也可能希望返回一个包含单个 null 取而代之的是价值。如果是这样的话你可以用 DefaultIfEmpty 方法

    var single = (from x in allXmlUsers orderby x.createdOn descending select x)
                 .Take(1)
                 .DefaultIfEmpty()
                 .ToList();
    
        2
  •  0
  •   Ousmane D.    7 年前

    如果这是一个您经常使用的操作,那么另一个选项是创建 ToSingletonList 扩展方法如下:

    public static class Extensions
    {  
         /// <summary>
         /// Returns the first element of the sequence in a list or a default value in a list if the sequence contains no elements.
         /// </summary>
         /// <param name="source">The IEnumerable<T> to return the first element of.</param>
         /// <returns>default in a list if source is empty; otherwise, the first element in source in a list.</returns>
    
        public static List<T> ToSingletonList<T>(this IEnumerable<T> source) => 
                   new List<T> { source.FirstOrDefault() };
    }
    

    在你的情况下你会:

    var single = (from x in allXmlUsers orderby x.createdOn descending select x).ToSingletonList();