C# 如何从列表中找到最后一个元素?

C# 如何从列表中找到最后一个元素?,c#,list,C#,List,我有一个列表,比如: List<String> lsRelation = new List<String>{"99","86","111","105"}. 这不管用。因此,如果您知道这是一个具有索引器的IList,那么如何使用last()查找列表中倒数第二个元素呢 string secondLast = null; if (lsRelation.Count >= 2) secondLast = lsRelation[lsRelation.Count -

我有一个
列表
,比如:

 List<String> lsRelation = new List<String>{"99","86","111","105"}.

这不管用。因此,如果您知道这是一个具有索引器的
IList
,那么如何使用
last()
查找列表中倒数第二个元素呢

string secondLast = null;
if (lsRelation.Count >= 2)
    secondLast = lsRelation[lsRelation.Count - 2];
您可以创建如下扩展:

public static T SecondLast<T>(this IEnumerable<T> items)
{
    if (items == null) throw new ArgumentNullException("items");
    IList<T> list = items as IList<T>;
    if (list != null)
    {
        int count = list.Count;
        if (count > 1)
        {
            return list[count - 2];
        }
        else
            throw new ArgumentException("Sequence must contain at least two elements.", "items");
    }
    else
    {
        try
        {
            return items.Reverse().Skip(1).First();
        } catch (InvalidOperationException)
        {
            throw new ArgumentException("Sequence must contain at least two elements.", "items");
        }
    }
}

使用
Last()
无法执行此操作。试试这个。取列表的长度并减去2:

if (lsRelation.Count >= 2)
{
    var item = lsRelation[lsRelation.Count - 2];
}
编辑:

根据注释,下面是一个使用
Last()
方法的示例,使用该方法很荒谬:

if (lsRelation.Count >= 2)
{
    var item = lsRelation.Last(x => x == lsRelation[lsRelation.Count - 2]);
}
使用:


您可以使用
ElementAt(list.Count-2)

List lsRelation=新列表{“99”、“86”、“111”、“105”};
Console.WriteLine(lsRelation.ElementAt(lsRelation.Count-2));//111

有很多方法可以选择。我只想提一个我在这里还没见过的例子:

List<string> lsRelation = new List<String>{"99","86","111","105"};
String strSecondLast = lsRelation.Skip(lsRelation.Count() - 2).First();
List lsRelation=新列表{“99”、“86”、“111”、“105”};
字符串strSecondLast=lsRelation.Skip(lsRelation.Count()-2.First();
C#8.0开始您可以使用以访问与序列结尾相关的元素:

if(lsRelation.Count>=2)
secLast=lsRelation[^2];

有关更多信息,请参见

如果只有一个项目或根本没有项目,应该返回什么?@Caramiriel:如果尝试
arr[arr.Length]
,您希望数组返回什么?除了例外,别无选择。作为
null
的每个值都可以是集合中的有效值。因此,您无法区分集合少于两个元素的情况和元素实际为
null
@TimSchmelter的情况:有多种方法可以做到这一点(异常、TryGet模式、超出范围时为null),虽然我只是想让这个人考虑收藏中少于两件物品的可能性。可能的重复使用Last()无法做到这一点不正确,您可以将谓词重载用于last,并使用索引来测试它是否是给定索引之前的最后一个元素……这样做毫无意义:)在尝试
。First()
@RGraham:为什么?它将针对所需的情况引发异常。我应该返回什么?我可以返回的每个值(作为
default(T)
)都可能是一个有效值,甚至比抛出一个有意义的异常还要糟糕。@RGraham:我编辑了答案,使异常更加明确。
if (lsRelation.Count >= 2)
{
    var item = lsRelation.Last(x => x == lsRelation[lsRelation.Count - 2]);
}
if (lsRelation.Count >= 2)
    secLast = lsRelation[lsRelation.Count - 2];
List<String> lsRelation = new List<String> { "99", "86", "111", "105" };
Console.WriteLine(lsRelation.ElementAt(lsRelation.Count - 2)); // 111
List<string> lsRelation = new List<String>{"99","86","111","105"};
String strSecondLast = lsRelation.Skip(lsRelation.Count() - 2).First();