Jorge Serrano
  • Home

C# 8.0 – Specification – Index and Ranges

  • By jorge
  • Ago-31-2019
  • C# 8.0
  • 0 Comments.

Índice general – C# 8.0 – Specification

En esta entrada, vamos a ver una de las nuevas características de C# 8.0, denominada Index and Ranges o Índices y Rangos.

Antes de entrar en los ejemplos prácticos de estas nuevas características tengamos en cuenta que estas características son posibles gracias a dos nuevos operadores incluidos en C#.

Se trata del operador ^ y del operador ..

Estos operadores se pueden utilizar de forma separada o conjunta.

El soporte de estos dos operadores se logra a través de dos nuevas estructuras incorporadas en el lenguaje, System.Index y System.Range, ambas pertenecientes a System.Runtime.dll y netstandard.dll.

Index representa en su caso un índice (como indica su nombre) dentro de una secuencia (operador ^).
Range por su parte, representa un sub rango dentro de una secuencia (operador ..).

Para entenderlos mejor, voy a explicar de forma práctica y con más profundidad cómo funcionan y qué nos puede aportar cada uno de ellos.

 

Index

Para Index, vamos a utilizar el operador ^

Supongamos el siguiente array de datos:

private static string[] _myArray = { 
"One", "Two", "Three", "Four", "Five", 
"Six", "Seven", "Eight", "Nine", "Ten" 
};

Imaginemos que queremos obtener el primer elemento y el último de ese array.
Obtener el primer elemento es realmente sencillo: _myArray[0]
Obtener el último requerirá conocer el número de elementos y acceder al último:

_myArray[_myArray.Count() - 1]

Para hacer compatible esta forma de acceder a los elementos del array, podemos utilizar Index también.
Bastará con declarar el primer elemento y el último como tipos Index.

Index first = 0;
Index last = ^1;

Para acceder a sus elementos, deberemos hacer algo así como:

_myArray[first]
_myArray[last]

Como podemos apreciar en este ejemplo, el uso es cómodo aunque muy similar al tradicional.

 

Range

Para Range, vamos a utilizar el operador ..

Suponiendo el mismo array de datos que teníamos para Index, imaginemos que queremos obtener todos los elementos del array a partir de la posición 2 del mismo, es decir, el tercer elemento y así hasta el final.

Para ello, podemos utilizar la siguiente instrucción de código:

_myArray[2..]

Supongo que lo tenemos todos en mente, pero conviene recordar que en C# el índice de elementos de un array empieza por 0, por lo que tenemos que tener en consideración que los índices del array son 0, 1, 2…, y por lo tanto el 2 es el tercer elemento.

Así que en este ejemplo obtendríamos: Three, Four, Five, Six, Seven, Eight, Nine, Ten

 

Index and Ranges

Además de poder utilizar de forma independiente los operadores de Index y Range, también podemos utilizar ambos operadores de forma conjunta.

Reutilizando el array de datos que vimos inicialmente, vamos a escribir el siguiente código:

_myArray[^4..]

Como vemos aquí, estamos utilizando ambos operadores.
En este caso, indicamos que nos vamos a situar al final del array y vamos a recuperar los últimos cuatro elementos del mismo (^4).
De esta manera, obtendremos:

Seven, Eight, Nine, Ten

Sin embargo, no sólo tenemos la posibilidad de trabajar con arrays.
También podemos trabajar con cadenas de texto, y podemos obtener de ella una parte de la misma.

Imaginemos el siguiente texto declarado como:

var message = "Hello, this is a sample text";

Si escribimos la siguiente instrucción de código:

message[^11..^0]

Estaremos obteniendo el texto: «sample text»
En este caso, nos situaremos al final de la cadena de texto y nos posicionaremos 11 caracteres atrás.
Desde allí recuperaremos todos los caracteres hasta el final.

Es como podemos ver, una forma muy similar de acceder a un elemento.
De hecho, podríamos haber indicado lo mismo de esta otra forma:

message[^11..]

Ahora bien, podríamos dar una vuelta de tuerca a Index y Ranges y pensar un poco en objetos.

Partamos de una clase inicial:

private class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Creemos un array de tipo Person y agregemos algunos elementos al array.

Por ejemplo:

var people = new Person[]
{
    new Person() { Id = 0, Name = "Peter" },
    new Person() { Id = 1, Name = "Mary" },
    new Person() { Id = 2, Name = "John" },
    new Person() { Id = 3, Name = "Anna" },
    new Person() { Id = 4, Name = "Jonas" },
    new Person() { Id = 5, Name = "Rose" },
    new Person() { Id = 6, Name = "Lya" }
};

Y escribamos este código:

foreach (var person in people[2..^2])
{
    Console.WriteLine($"Name: '{person.Name}'");
}

Aquí nos estaremos situando en el segundo elemento (recordemos que los íncides en arrays en C# empiezan por 0, por lo que en realidad es el tercer elemento correspondiente a «John»).
Y recogeremos todos los elementos menos los dos últimos.

Así que el resultado que obtendremos será:

John, Anna, Jonas

Como podemos apreciar, Index y Range nos ofrece una forma más sencilla y rápida de acceder a elementos pertenecientes a una matriz o array.
Nos evita recorrer los elementos para acceder a los últimos (si es nuestra necesidad), y nos permite realizar accesos directos a esos elementos.
Todo esto con una mejora de rendimiento y eficiencia dentro de nuestras aplicaciones, algo que siempre viene bien.

Se trata por lo tanto de una característica bastante útil, si bien, la forma tradicional que estábamos utilizando para acceder a elementos de la matriz o array sigue siendo válida.

Happy Coding!

Comments

Deja un comentario Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

← Previous Post Next Post →

Jorge Serrano

MVP Reconnect


¡Subscríbete a mi canal!
YouTube

Donaciones
Donation

Entradas recientes

  • Go – Arrays
  • Go – Operators
  • Go – Constants
  • Go – Tipos de Datos
  • Go – Variables
  • Hello Go-rld!
  • Introducción a Go o Golang
  • JSON Patch en ASP.NET Core 5 Web API
  • Null Checking en C#
  • ¿Porqué mi página web por defecto de ASP.NET Core no se vé en mi Azure Web App y me da un 404?

Categorías

  • .NET 5
  • .NET Core
  • .NET Core 3.0
  • .NET Core 3.1
  • .NET Framework 2.0
  • .NET Framework 3.0
  • .NET Framework 3.5
  • .NET Framework 4.0
  • .NET Framework 4.5
  • .NET Framework 4.6
  • .NET Framework 4.7
  • .NET Framework 4.8
  • .NET Standard 2.0
  • .NET Standard 2.1
  • AMQP
  • Android
  • Angular
  • API REST
  • Apple
  • Apple iOS
  • Apple macOs
  • Arquitectura
  • ASP.NET
  • ASP.NET Core
  • ASP.NET Core 3
  • ASP.NET Core 5
  • AWS
  • Azure App Service
  • Azure Application Insights
  • Azure Cosmos DB
  • Azure Database Migration Service
  • Azure Databricks
  • Azure DevOps
  • Azure Event Grid
  • Azure Functions
  • Azure IoT
  • Azure Portal
  • Azure PowerShell
  • Azure Queue Storage
  • Azure SQL
  • Azure Storage
  • Azure Virtual Datacenter
  • Azure WebApps
  • Big Data
  • Bing
  • Blazor
  • Blog
  • Bots
  • C#
  • C# 7.0
  • C# 7.1
  • C# 7.2
  • C# 7.3
  • C# 8.0
  • C# 9.0
  • Channel 9
  • Codeplex
  • Codespaces
  • Containers
  • Debugging
  • DevOps
  • Docker
  • Electron
  • Entity Framework
  • Entity Framework Core
  • Entity Framework Core 3.0
  • Entity Framework Core 5
  • Eventos
  • F#
  • FaaS
  • FeatureFlags
  • FeatureToggles
  • Feeds
  • Fluent Assertions
  • General
  • GIMP
  • Git
  • GitHub
  • Go
  • Google
  • Google Analytics
  • Gradle
  • gRPC
  • GSA
  • Historia de la Informática
  • HoloLens
  • HtmlAgilityPack
  • IdentityServer4
  • Inkscape
  • Ionic
  • iOS
  • IoT
  • Java
  • JavaScript
  • JDBC
  • JSON
  • Kubernetes
  • Lenguajes de Programación
  • Libros y Cursos
  • LINQ
  • Linux
  • LiteDB
  • Machine Learning
  • macOS
  • Microservices
  • Microsoft
  • Microsoft .NET Framework 4.5
  • Microsoft 365
  • Microsoft Azure
  • Microsoft Build
  • Microsoft Ignite
  • Microsoft Learn
  • Microsoft Orleans
  • Microsoft Surface Go
  • Microsoft Teams
  • ML.NET
  • MQTT
  • MRO
  • MS-DOS
  • MsCoders Madrid
  • MVP
  • NancyFx
  • Node.js
  • NoSQL
  • NuGet
  • NUnit
  • OData
  • ODP.NET Core
  • Office 2007
  • Office 2010
  • Office 2013
  • Office 2016
  • Office 2019
  • Office 365
  • Open Source
  • Open XML SDK
  • Opinión
  • Orchard CMS
  • OT
  • PaaS
  • Patterns
  • PdfSharpCore
  • Performance
  • PHP
  • Postman
  • Power BI
  • PowerShell
  • PowerShell Core
  • Productividad
  • Project Server 2019
  • R
  • Rendimiento
  • Scala
  • Scraper
  • Security
  • Serverless
  • Service Fabric
  • SharePoint Server 2019
  • SignalR
  • Sin categoría
  • Sistemas Distribuidos
  • Skype
  • Skype for Business Server 2019
  • Small Basic Online
  • SQL Server 2005
  • SQL Server 2008
  • SQL Server 2012
  • SQL Server 2014
  • SQL Server 2016
  • SQL Server 2017
  • SQL Server 2019
  • STOMP
  • Swagger
  • Testing
  • TFS 2017
  • TFS 2018
  • Tools
  • TypeScript
  • Unity
  • UWP
  • UX
  • Visio
  • Visual Basic
  • Visual Studio 2010
  • Visual Studio 2012
  • Visual Studio 2013
  • Visual Studio 2015
  • Visual Studio 2017
  • Visual Studio 2017 for Mac
  • Visual Studio 2019
  • Visual Studio 2019 for Mac
  • Visual Studio App Center
  • Visual Studio Code
  • Visual Studio IntelliCode
  • Visual Studio Live Share
  • Visual Studio Live Share Audio
  • Visual Studio Online
  • VS Anywhere
  • Vue.js
  • Web API
  • WebAssembly
  • WinDbg
  • Windows
  • Windows 10
  • Windows Compatibility Pack
  • Windows Phone 10
  • Windows Phone 7
  • Windows Phone 8
  • Windows Server 2008
  • Windows Server 2012
  • Windows Server 2016
  • Windows Server 2019
  • Windows Service
  • WinForms
  • WinUI
  • WPF
  • Xamarin
  • Xbox
  • Xcode
  • Xiaomi Mi Band 2
  • xUnit
  • YAML

Archivos

  • enero 2021
  • diciembre 2020
  • noviembre 2020
  • octubre 2020
  • septiembre 2020
  • agosto 2020
  • julio 2020
  • junio 2020
  • mayo 2020
  • abril 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • diciembre 2019
  • noviembre 2019
  • octubre 2019
  • septiembre 2019
  • agosto 2019
  • julio 2019
  • junio 2019
  • mayo 2019
  • abril 2019
  • marzo 2019
  • febrero 2019
  • enero 2019
  • diciembre 2018
  • noviembre 2018
  • octubre 2018
  • septiembre 2018
  • agosto 2018
  • julio 2018
  • junio 2018
  • mayo 2018
  • abril 2018
  • marzo 2018
  • febrero 2018
  • enero 2018
  • diciembre 2017
  • noviembre 2017
  • octubre 2017
  • septiembre 2017
  • agosto 2017
  • julio 2017
  • junio 2017
  • febrero 2015
  • octubre 2014
  • junio 2014
  • marzo 2014
  • febrero 2014
  • enero 2014
  • diciembre 2013
  • septiembre 2013
  • agosto 2013
  • julio 2013
  • junio 2013
  • abril 2013
  • febrero 2013
  • enero 2013
  • diciembre 2012
  • noviembre 2012
  • septiembre 2012
  • agosto 2012
  • junio 2012
  • mayo 2012
  • abril 2012
  • marzo 2012
  • febrero 2012
  • enero 2012
  • diciembre 2011
  • noviembre 2011
  • octubre 2011
  • septiembre 2011
  • agosto 2011
  • julio 2011
  • junio 2011
  • mayo 2011
  • abril 2011
  • marzo 2011
  • enero 2011
  • diciembre 2010
  • noviembre 2010
  • octubre 2010
  • septiembre 2010
  • agosto 2010
  • julio 2010
  • junio 2010
  • mayo 2010
  • abril 2010
  • marzo 2010
  • febrero 2010
  • enero 2010
  • diciembre 2009
  • noviembre 2009
  • octubre 2009
  • septiembre 2009
  • agosto 2009
  • julio 2009
  • junio 2009
  • mayo 2009
  • abril 2009
  • marzo 2009
  • febrero 2009
  • enero 2009
  • diciembre 2008
  • noviembre 2008
  • octubre 2008
  • septiembre 2008
  • agosto 2008
  • julio 2008
  • junio 2008
  • mayo 2008
  • abril 2008
  • marzo 2008
  • febrero 2008
  • enero 2008
  • diciembre 2007
  • noviembre 2007
  • octubre 2007
  • septiembre 2007
  • agosto 2007
  • julio 2007
  • junio 2007
  • mayo 2007
  • abril 2007
  • marzo 2007
  • febrero 2007
  • enero 2007
  • diciembre 2006
  • noviembre 2006
  • octubre 2006
  • septiembre 2006
  • agosto 2006
  • julio 2006
  • junio 2006
  • mayo 2006
About This Site

A cras tincidunt, ut tellus et. Gravida scel ipsum sed iaculis, nunc non nam. Placerat sed phase llus, purus purus elit.

Archives Widget
  • January 2010
  • December 2009
  • November 2009
  • October 2009
Categories
  • Entertainment
  • Technology
  • Sports & Recreation
  • Jobs & Lifestyle
Search
  • twitter

Powered by WordPress  |  Business Directory by InkThemes.

This site uses cookies: Find out more.