Existe tipo range no C#?

8 respostas
matheuslmota

O tipo range, que eu conheci no pascal, existe no C#? Caso não exista, existe alguma forma de implementá-lo no C#? Acho isso muito legal para declarar arrays de uma forma mais decente.

8 Respostas

ViniGodoy

Exatamente igual, não. Mas há coisas muito parecidas (e muito mais poderosas também) que você pode fazer com LINQ.

Mas para o feijão com arroz que o pascal faz, a sintaxe não ficará tão enxuta:
http://stevenharman.net/blog/archive/2008/02/12/ruby-has-ranges-and-so-does-c.aspx
http://jrwren.wrenfam.com/blog/2007/12/04/the-good-stuff-is-hidden/

matheuslmota

ViniGodoy:
Exatamente igual, não. Mas há coisas muito parecidas (e muito mais poderosas também) que você pode fazer com LINQ.

Mas para o feijão com arroz que o pascal faz, a sintaxe não ficará tão enxuta:
http://stevenharman.net/blog/archive/2008/02/12/ruby-has-ranges-and-so-does-c.aspx
http://jrwren.wrenfam.com/blog/2007/12/04/the-good-stuff-is-hidden/

Hum, já é algo. Mas abusando um pouco da linguagem, será que existe como escrever um código em C# equivalente à este em Delphi?

type Tipo1 = (TipoA, TipoB); Tipo2 = (TipoC, TipoD); Matriz:array[TipoA..TipoB, TipoC..TipoD] of double;

Esse negócio de usar enum como index de um array em pascal é muito show mesmo. Dá pra fazer algo parecido em C#?

ViniGodoy

Acho que com sintaxe tão simples assim, não. Até porque, o C# também não tem suporte a arrays com índice arbitrário.
Você até poderia criar uma classe que simulasse um array assim, e tivesse um construtor estático do tipo:

Mas daria um trabalho enorme, para um resultado extremamente pequeno, e uma sintaxe não tão elegante. =(

ViniGodoy

Agora, lindo mesmo eu acho isso aqui:

public class Cliente {
    public string Nome { get; set; }
    public int Idade {get; set; }

    public Cliente(String nome, int idade) {
       Nome = nome; 
       Idade = idade;
    }
}

IList<Cliente> clientes = new List<Cliente>();
clientes.add(new Cliente("Vinicius", 31));
clientes.add(new Cliente("Thingol", 30));
clientes.add(new Cliente("Matheus", 28));
clientes.add(new Cliente("Gandalf", 406));
clientes.add(new Cliente("Frodo", 106));
clientes.add(new Cliente("Darth Vader", 55));

//Seleciona o nome de todos os clientes maiores de 50, e os lista em ordem alfabética
var nomes = from cliente in clientes
    where cliente.idade > 50
    orderby cliente.nome
    select cliente.nome;
foreach (string nome in nomes) {
   Console.WriteLine(nome);
}

Eu realmente acho que o Java deveria copiar o LINQ. E o Pascal também. :)

matheuslmota
ViniGodoy:
Agora, lindo mesmo eu acho isso aqui:
public class Cliente {
    public string Nome { get; set; }
    public int Idade {get; set; }

    public Cliente(String nome, int idade) {
       Nome = nome; 
       Idade = idade;
    }
}

IList<Cliente> clientes = new List<Cliente>();
clientes.add(new Cliente("Vinicius", 31));
clientes.add(new Cliente("Thingol", 30));
clientes.add(new Cliente("Matheus", 28));
clientes.add(new Cliente("Gandalf", 406));
clientes.add(new Cliente("Frodo", 106));
clientes.add(new Cliente("Darth Vader", 55));

//Seleciona o nome de todos os clientes maiores de 50, e os lista em ordem alfabética
var nomes = from cliente in clientes
    where cliente.idade > 50
    orderby cliente.nome
    select cliente.nome;
foreach (string nome in nomes) {
   Console.WriteLine(nome);
}

Eu realmente acho que o Java deveria copiar o LINQ. E o Pascal também. :)

Isso é legal demais. O C# é cheio dessas sintaxes pra fazer coisas simples, como essa manipulação ai, que o Java não implementa.
Agora vetor com índices arbritários do pascal foi algo que eu achei bizarro no começo mas genial depois que eu vi isso sendo usado em uma aplicação onde eu trabalho.

ViniGodoy

O mais perto que o C# chega são os Dictionary (equivalentes ao Map do Java), já que sintaticamente podem ser acessados como se fossem arrays:

IDictionary<int, string> nomes = new SortedDictionary<int, String>(); nomes[10] = "Vinícius"; nomes[5] = "Matheus";

Mas não é a mesma coisa, já que os demais índices efetivamente não existem e poderiam ser inseridos a qualquer momento.

matheuslmota

ViniGodoy:
O mais perto que o C# chega são os Dictionary (equivalentes ao Map do Java), já que sintaticamente podem ser acessados como se fossem arrays:

IDictionary<int, string> nomes = new SortedDictionary<int, String>(); nomes[10] = "Vinícius"; nomes[5] = "Matheus";

Mas não é a mesma coisa, já que os demais índices efetivamente não existem e poderiam ser inseridos a qualquer momento.

Exatamente, também tinha pensado no Dictionary. Além do mais, isso seria, digamos, uma representação de uma matriz de duas dimensões com indíces específicos. Pra uma matriz de várias dimensões isso já não funcionaria, ou talvez até funcionaria usando algum tipo de adaptação técnica de alta periculosidade (ou seja, gambiarra).

ViniGodoy

É, talvez um Dictionary de Dictionary. Mas aí a coisa começa a ficar bem feia. :slight_smile:

Criado 2 de fevereiro de 2012
Ultima resposta 2 de fev. de 2012
Respostas 8
Participantes 2