我有一个像List<string>
:如何从列表中查找倒数第二个元素?
List<String> lsRelation = new List<String>{"99","86","111","105"}.
现在我想找到号码111是倒数第二个字符串。
所以我曾尝试:
String strSecondLast=lsrelation.Last() - 2;
不工作。那么我怎样才能找到使用Last()
的倒数第二个元素。
我有一个像List<string>
:如何从列表中查找倒数第二个元素?
List<String> lsRelation = new List<String>{"99","86","111","105"}.
现在我想找到号码111是倒数第二个字符串。
所以我曾尝试:
String strSecondLast=lsrelation.Last() - 2;
不工作。那么我怎样才能找到使用Last()
的倒数第二个元素。
用途:
if (lsRelation.Count >= 2)
secLast = lsRelation[lsRelation.Count - 2];
如果你知道这是一个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");
}
}
}
然后你就可以以这种方式使用它
可能要检查列表实际上是否包含至少一个item之前尝试'.First()' – CodingIntrigue
@Rraham:为什么?它会针对所期望的情况抛出异常。我应该返回什么呢?我可以返回的每个值(作为'default(T)')可能是一个有效的值,甚至比抛出一个有意义的异常更糟糕。 –
@TimSchmelter好点,没有考虑到 – CodingIntrigue
你不能这样做,使用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]);
}
*你不能这样做使用Last()*不正确,你可以使用谓词重载为last,并使用索引来测试它是否是给定索引之前的最后一个元素....它只是不会使任何意义这样做:) – CodingIntrigue
@Rraham:你说得对,查看我更新的答案:) – Abbas
您可以使用ElementAt(list.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();
如果只有一个项目或根本没有项目应该返回什么? – Caramiriel
@ Caramiriel:如果你尝试'arr [arr.Length]',你期望数组返回什么?除了例外,没有其他选择。每个值为null的值都可以是集合中的有效值。因此,您无法区分集合少于两个元素的情况和元素实际为“空”的情况。 –
@TimSchmelter:有很多种方法可以做到这一点(例外,TryGet模式,如果超出范围,则为null),但我只是想触发该人考虑收集中少于两个项目的可能性。 – Caramiriel