我有一个类似于 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];
您可以创建一个类似于以下的扩展:
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");
}
}
}
然后你可以这样使用它:
string secondLast = lsRelation.SecondLast();
.First()
之前,可能需要检查列表是否至少包含一个项目。 - CodingIntriguedefault(T)
)都可能是有效值,这甚至比抛出有意义的异常更糟糕。 - Tim SchmelterElementAt(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();
使用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]);
}
模糊的问题 - 如果您的列表只有一个元素怎么办?如果您的列表为空怎么办?如果您的列表为null怎么办?
List
的显而易见的答案是
var beforeLast = lsRelation[lsRelation.Count -2];
为了涵盖所有的边缘情况,我会使用
string beforeLast = null;
if (lsRelation != null && lsRelation.Count > 1)
beforeLast = lsRelation[lsRelation.Count - 2];
如果它是一个 IEnumerable<string>
,
string beforeLast = null;
if (lsRelation != null) {
int l_count = lsRelation.Count();
if (l_count > 1)
beforeLast = lsRelation.Skip(l_count - 2).Take(1);
}
arr[arr.Length]
,你期望数组返回什么?除了异常之外没有其他选择。在集合中,每个值都可以作为null
的有效值。因此,你无法区分集合少于两个元素的情况和元素实际上是null
的情况。 - Tim Schmelter