Existe tipo range no C#?

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.

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/

[quote=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/[/quote]

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#?

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. =(

Agora, lindo mesmo eu acho isso aqui:

[code]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);
}[/code]

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

[quote=ViniGodoy]Agora, lindo mesmo eu acho isso aqui:

[code]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);
}[/code]

Eu realmente acho que o Java deveria copiar o LINQ. E o Pascal também. :slight_smile:
[/quote]

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.

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&lt;int, string&gt; nomes = new SortedDictionary&lt;int, String&gt;(); 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.

[quote=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&lt;int, string&gt; nomes = new SortedDictionary&lt;int, String&gt;(); 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.[/quote]

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).

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