C# 是否有一个简单的快捷方式从数组中获取下一个到最后一个项目?

C# 是否有一个简单的快捷方式从数组中获取下一个到最后一个项目?,c#,.net,C#,.net,有没有一种简单的方法可以从数组中获取下一个到最后一个项目?例如,我可能有以下字符串数组: var myArr1 = new string[]{"S1", "S2", "S3"}; var myArr2 = new string[]{"S1", "S2", "S3", "S4"}; 我需要编写一个通用例程,它将为myArr1返回“S2.S3”,为myArr2返回“S3.S4”。使用last()获取最后一项非常简单,但似乎没有last(-1)选项。有类似的吗?如果没有,那么什么是最简单、最优雅的方

有没有一种简单的方法可以从数组中获取下一个到最后一个项目?例如,我可能有以下字符串数组:

var myArr1 = new string[]{"S1", "S2", "S3"};
var myArr2 = new string[]{"S1", "S2", "S3", "S4"};

我需要编写一个通用例程,它将为myArr1返回“S2.S3”,为myArr2返回“S3.S4”。使用last()获取最后一项非常简单,但似乎没有last(-1)选项。有类似的吗?如果没有,那么什么是最简单、最优雅的方法呢?

您可以使用以下代码获取数组的最后一个元素

myArr1[myArr1.Length - 2]

myArr2[myArr2.Length - 2] 
输出

S2    
S3
在线演示:

已更新…

输出

S2.S3
S3.S4

在线演示:

您可以使用此代码获取数组的第二个最后一个元素

myArr1[myArr1.Length - 2]

myArr2[myArr2.Length - 2] 
输出

S2    
S3
在线演示:

已更新…

输出

S2.S3
S3.S4

在线演示:

这是基于off@Ehsan的答案(它是用VB编写的,但我把它翻译成了C)

string lastTwoString(string[]数组)
{
返回(数组[array.Length-2]+“+array[array.Length-1]);
}

但是,如果数组小于2,则会引发异常。

这是基于off@Ehsan的答案(该答案是用VB编写的,但我将其转换为C#)

string lastTwoString(string[]数组)
{
返回(数组[array.Length-2]+“+array[array.Length-1]);
}

但是,如果数组小于2,这将引发异常。

使用System.Linq可以执行以下操作:

String.Join(".", arr.Skip(arr.Length - 2));

使用System.Linq,您可以执行以下操作:

String.Join(".", arr.Skip(arr.Length - 2));
与林克 <>这个需求是如此的基础和直觉,我会考虑编写我自己的<>代码>最后一个(int)<代码>扩展方法——这正是你想象中的一个——它可能看起来像:

public static class ExtensionMethods
{
    public static IEnumerable<T> Last<T>(this IEnumerable<T> This, int count)
    {
        return This.Reverse().Take(count).Reverse();
    }
}
哪些产出:

S2.S3
使用阵列(更高效) 另一方面,如果您希望提高效率,则只需使用数组和已知索引,这将比使用
IEnumerable
(必须进行扫描)更有效

公共静态IEnumerable Last(this T[]this,int count)
{
var i=该长度;
如果(计数>i)计数=i;
而(计数-->0)则返回此[--i];
}
…执行完全相同的操作,但仅适用于阵列。

使用LINQ <>这个需求是如此的基础和直觉,我会考虑编写我自己的<>代码>最后一个(int)<代码>扩展方法——这正是你想象中的一个——它可能看起来像:

public static class ExtensionMethods
{
    public static IEnumerable<T> Last<T>(this IEnumerable<T> This, int count)
    {
        return This.Reverse().Take(count).Reverse();
    }
}
哪些产出:

S2.S3
使用阵列(更高效) 另一方面,如果您希望提高效率,则只需使用数组和已知索引,这将比使用
IEnumerable
(必须进行扫描)更有效

公共静态IEnumerable Last(this T[]this,int count)
{
var i=该长度;
如果(计数>i)计数=i;
而(计数-->0)则返回此[--i];
}

…执行完全相同的操作,但仅适用于数组。

myArr[myArr.length-2]+“+myArr[myArr.length-1]
-应该可以$“{myArr1[myArr1.Length-2]}.{myArr1.Last()}”关于这一点,这里有一个很大的问题:(但重点是使用LINQ)。您需要对其进行一些范围检查…我为.NET集合创建了一个nuget包,其中包含一些额外的类似LINQ的运算符方法(不适用于实体框架或类似的方法)这就是您所需要的--在本例中,它将是
string.Join(“.”,myArr1.Last(2))
,您可以使用nuget软件包管理器在Visual Studio中添加它。
myArr[myArr.length-2]+“+myArr[myArr.length-1]
-这应该可以$“{myArr1[myArr1.Length-2]}.{myArr1.Last()}”关于这一点,这里有一个很大的问题:(但重点是使用LINQ)。您需要对其进行一些范围检查…我为.NET集合创建了一个nuget包,其中包含一些额外的类似LINQ的运算符方法(不适用于实体框架或类似的方法)这就是您所需要的--在本例中,它将是
string.Join(“.”,myArr1.Last(2))
,您可以使用nuget包管理器在Visual Studio中添加它。嗯。。。那不是他们要的。。。他们想要一个数组的最后两个元素。不是两个中倒数第二个…@nyrguds,谢谢你。更新了。嗯。。。那不是他们要的。。。他们想要一个数组的最后两个元素。不是两个中倒数第二个…@nyrguds,谢谢你。更新。
Take
只需要元素存在的时间,所以它是100%安全的,但最后一个可能会给出超出范围的异常…@nyrguds谢谢,我根据您的反馈添加了一个边界条件。
Take
只需要元素存在的时间,所以它是100%安全的,但最后一个可能会给出超出范围的异常…@nyrguds谢谢,我根据你的反馈添加了一个边界条件。