2014-04-04 288 views
6

我有一个像List<string>如何从列表中查找倒数第二个元素?

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

现在我想找到号码111是倒数第二个字符串。

所以我曾尝试:

String strSecondLast=lsrelation.Last() - 2; 

不工作。那么我怎样才能找到使用Last()的倒数第二个元素。

+0

如果只有一个项目或根本没有项目应该返回什么? – Caramiriel

+0

@ Caramiriel:如果你尝试'arr [arr.Length]',你期望数组返回什么?除了例外,没有其他选择。每个值为null的值都可以是集合中的有效值。因此,您无法区分集合少于两个元素的情况和元素实际为“空”的情况。 –

+0

@TimSchmelter:有很多种方法可以做到这一点(例外,TryGet模式,如果超出范围,则为null),但我只是想触发该人考虑收集中少于两个项目的可能性。 – Caramiriel

回答

4

用途:

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

如果你知道这是一个IList<T>其中有一个索引:

string secondLast = null; 
if (lsRelation.Count >= 2) 
    secondLast = lsRelation[lsRelation.Count - 2]; 

您可以创建一个扩展,如:

string secondLast = lsRelation.SecondLast(); 

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"); 
     } 
    } 
} 

然后你就可以以这种方式使用它

+0

可能要检查列表实际上是否包含至少一个item之前尝试'.First()' – CodingIntrigue

+0

@Rraham:为什么?它会针对所期望的情况抛出异常。我应该返回什么呢?我可以返回的每个值(作为'default(T)')可能是一个有效的值,甚至比抛出一个有意义的异常更糟糕。 –

+0

@TimSchmelter好点,没有考虑到 – CodingIntrigue

3

你不能这样做,使用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]); 
} 
+3

*你不能这样做使用Last()*不正确,你可以使用谓词重载为last,并使用索引来测试它是否是给定索引之前的最后一个元素....它只是不会使任何意义这样做:) – CodingIntrigue

+0

@Rraham:你说得对,查看我更新的答案:) – Abbas

5

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

List<String> lsRelation = new List<String> { "99", "86", "111", "105" }; 
Console.WriteLine(lsRelation.ElementAt(lsRelation.Count - 2)); // 111 
3

有很多选项可以做到这一点。只是提一个我还没有看到这里:

List<string> lsRelation = new List<String>{"99","86","111","105"}; 
String strSecondLast = lsRelation.Skip(lsRelation.Count()-2).First(); 
相关问题