C# -  Apresentando SortedList


Neste artigo vou apresentar a classe genérica SortedList da linguagem C#

A classe SortedList representa uma coleção de pares de chave/valor que são classificados pelas chaves e podem ser acessados ​​por chave e por índice. Esta classe está incluída no namespace System.Collection.

Um objeto SortedList gerencia internamente dois arrays para armazenar os elementos da lista; ou seja, um array para as chaves e outro array para os valores. Cada elemento é um par de chave/valor que pode ser acessado como um objeto DictionaryEntry. Uma chave não pode ser null, mas um valor pode.

Uma SortedList possui 6 tipos diferentes de construtor como SortedList(), SortedList(IComparer), etc.

No index SortedList, a sequência é baseada na seqüência de classificação. Quando um elemento é adicionado, ele é inserido na SortedList na ordem de classificação correta e a indexação é ajustada de acordo.

Quando um elemento é removido, a indexação também é ajustada de acordo. Portanto, o índice de um par chave /valor específico pode ser alterado conforme os elementos são adicionados ou removidos do objeto SortedList.

Elementos nesta coleção podem ser acessados ​​usando um índice inteiro, e, os índices são baseados em zero.

Podemos usar uma instrução foreach para retornar um objeto do tipo de elementos na coleção. Como cada elemento do objeto SortedList é um par chave/valor, o tipo de elemento não é o tipo da chave ou o tipo do valor. Em vez disso, o tipo de elemento é um DictionaryEntry.

As principais propriedades desta classe são:

Keys
Obtém as chaves contidas em um objeto SortedList.
Values
Obtém os valores contidos no objeto SortedList.
Item[Object]
Obtém ou atribui o valor associado com a chave especifica no objeto SortedList.
Capacity
Obtém ou atribui a capacidade ou no. de elementos de um objeto SortedList.
Count
Obtém o no. de elementos contidos no objeto SortedList..
IsFixedSize
Obtém o valor booleano do SortedList
IsReadOnly
Obtém o valor indicando se o objeto SortedList é read-only.

Os principais métodos desta classe são:

Add(Object, Object)
Adiciona um elemento com a chave e o valor especificados a um objeto SortedList.
Clone()
Cria uma cópia superficial do objeto SortedList.
Contains(Object)
Determina se o SortedList contém uma chave específica
ContainsKey(Object)
Determina se o SortedList contém uma chave específica
ContainsValue(Object)
Determina se o SortedList contém um valor específico
IndexOfKey(Object)
Retorna o índice (base zero) da chave especificada
IndexOfValue(Object)
Retorna o indice (base zero) da primeira ocorrencia do valor especificado

A seguir veremos algumas operações usando esses métodos e propriedades na prática.

recursos usados:

Criando o projeto no VS 2019 Community

Vamos criar um projeto usando a linguagem C# do tipo Console para .NET Core : Console App(.NET Core)

Podemos chamar o projeto de CShp_SortedList1.

1- No primeiro exemplo vamos adicionar números não ordenados a uma SortedList e exibir os elementos usando as propriedades key e value:

private static void Exemplo1()
{
   SortedList NumeroSortedList = new SortedList();
            
   //Adiciona itens não ordenados na SortedList.   
   NumeroSortedList.Add(4, "Quatro");
   NumeroSortedList.Add(1, "Um");
   NumeroSortedList.Add(3, "Três");
   NumeroSortedList.Add(7, "Sete");
   NumeroSortedList.Add(5, "Cinco");
   NumeroSortedList.Add(6, "Seis");
   NumeroSortedList.Add(2, "Dois");
   Console.WriteLine("--SortedList (ordenada pela chaves)--");
   //podemos usar o laço foreach para percorrer todos os itens
   //lendo-os usando as propriedades Key e Value
   foreach (DictionaryEntry item in NumeroSortedList)
   {
     Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
     }
}

2- Vamos agora criar uma SortedList usando strings :

private static void Exemplo2()
{
   SortedList PaisesSortedList = new SortedList();
  //cria uma lista de paises 
  List<string> PaisesLetra_A = new List<string> { "Angola", "Albania", "Algeria", "Andorra" };
  List<string> PaisesLetra_B = new List<string> { "Brasil", "Bolívia", "Bangladesh", "Barbados" };
  List<string> PaisesLetra_C = new List<string> { "Camboja", "Colombia", "Canada", "Cabo Verde" };
  List<string> PaisesLetra_D = new List<string> { "Dinamarca", "Djibuti", "Dominica"};
  List<string> PaisesLetra_E = new List<string> { "Egito", "Equador", "Espanha", "Etiópia" };
  // Adiciona itens não ordenados ao SortedList.   
  PaisesSortedList.Add('A', PaisesLetra_A);
  PaisesSortedList.Add('D', PaisesLetra_D);
  PaisesSortedList.Add('C', PaisesLetra_C);
  PaisesSortedList.Add('B', PaisesLetra_B);
  PaisesSortedList.Add('E', PaisesLetra_E);
  Console.WriteLine("--Ordem Alfabética Nome do País--");
  foreach (DictionaryEntry item in PaisesSortedList)
   {
       List<string> nomePaises  = PaisesSortedList[item.Key] as List<string>;
       Console.WriteLine($"Alfabética: {item.Key}, --> Nome do País: {string.Join(", ", nomePaises)}");
  }
}

Abaixo temos a execução do código acima:

3- Agora veremos um exemplo de como usar Contains(), ContainsKey() e ContainsValue :

        private static void Exemplo3()
        {
            // Cria um SortedList 
            SortedList mSortedList = new SortedList();
            // adiciona itens
            mSortedList.Add("j", "Jose");
            mSortedList.Add("c", "C#");
            mSortedList.Add("m", "Macoratti");
            mSortedList.Add("n", "Nenhum");
            // Verifia se um objeto SortedList 
            // contém um valor especifico
            Console.WriteLine("A SortedList contém o valor 'Macoratti' ? ");
            Console.Write(mSortedList.ContainsValue("Macoratti"));
            // contém uma chave especifica
            Console.WriteLine("\nA SortedList contém a chave 'j' ? ");
            Console.Write(mSortedList.ContainsKey("j"));
            //
            Console.WriteLine("\nA SortedList contém a chave 'n' ? ");
            Console.Write(mSortedList.Contains("n"));
            Console.Write("");
        }

Abaixo vemos o resultado da execução do código acima:

4- Agora veremos um exemplo de como usar Capacity, isFixedSize, IsReadOnly, IndexOfkey e IndexOfValue :

 private static void Exemplo4()
  {
            SortedList NumeroSortedList = new SortedList();

            //Adiciona itens não ordenados na SortedList.  
            NumeroSortedList.Add(4, "Quatro");
            NumeroSortedList.Add(1, "Um");
            NumeroSortedList.Add(3, "Três");
            NumeroSortedList.Add(7, "Sete");
            NumeroSortedList.Add(5, "Cinco");
            NumeroSortedList.Add(6, "Seis");
            NumeroSortedList.Add(2, "Dois");
            NumeroSortedList.Add(9, "Nove");
            NumeroSortedList.Add(8, "Oito");

            Console.WriteLine("--Propriedade Capacity --");
            Console.WriteLine("");
            Console.WriteLine($"Capacity da NumberSortedList : {NumeroSortedList.Capacity}");
            Console.WriteLine("");
            Console.WriteLine("--Propriedade IsFixedSize --");
            Console.WriteLine("");
            Console.WriteLine($"NumeroSortedList tem um tamanho fixo : {NumeroSortedList.IsFixedSize}");
            Console.WriteLine("");
            Console.WriteLine("--Propriedade IsReadOnly --");
            Console.WriteLine("");
            Console.WriteLine($"NumeroSortedList é read-only. : {NumeroSortedList.IsReadOnly}");
            Console.WriteLine("");
            Console.WriteLine("--Método IndexOfKey --");
            Console.WriteLine("");
            Console.WriteLine($"'IndexOfKey(5)' Retorna o index da '5'(Key) : {NumeroSortedList.IndexOfKey(5)}");
            Console.WriteLine("");
            Console.WriteLine("--Método IndexOfValue --");
            Console.WriteLine("");
            Console.WriteLine($"IndexOfValue(\"Seis\") Retorna o index da \"Seis\"(Value) : {NumeroSortedList.IndexOfValue("Seis")}");

 }
 

A seguir o resultado da execução do código acima:

5- Agora veremos um exemplo de como usar Clear e Count:

private static void Exemplo5()
        {
            SortedList NumeroSortedList = new SortedList();

            //Adiciona itens não ordenados na SortedList.  
            NumeroSortedList.Add(4, "Quatro");
            NumeroSortedList.Add(1, "Um");
            NumeroSortedList.Add(3, "Três");
            NumeroSortedList.Add(7, "Sete");
            NumeroSortedList.Add(5, "Cinco");
            NumeroSortedList.Add(6, "Seis");
            NumeroSortedList.Add(2, "Dois");
            NumeroSortedList.Add(9, "Nove");
            NumeroSortedList.Add(8, "Oito");

            Console.WriteLine("--Método Clear() e Propriedade Count --");
            Console.WriteLine("");

            Console.WriteLine($"Antes de 'NumeroSortedList.Clear()' No. de Itens = {NumeroSortedList.Count}");
            NumeroSortedList.Clear();
            Console.WriteLine($"Depois de 'NumeroSortedList.Clear()' No. de Itens = {NumeroSortedList.Count}");
        }

Abaixo o resultado do código acima:

6 - Para concluir veremos com substituir um valor de um índice especifico e um objeto SortedList.

Vamos substituir os índices 1 e 3 da SortedList criada:

        private static void Exemplo6()
        {
            // cria uma lista SortedList
            SortedList minhaLista = new SortedList();
            // Incluir elementos
            minhaLista.Add("Primeiro", "Bolívia");
            minhaLista.Add("Segundo", "Paraguai");
            minhaLista.Add("Terceiro", "Venezuela");
            minhaLista.Add("Quarto", "Chile");
            minhaLista.Add("Quinto", "Uruguai");
            // Antes de substituir as chaves e valores 
            Console.WriteLine("----- Antes de alterar -----");
            Console.WriteLine("Index \t\t Keys \t\tValues");
            for (int i = 0; i < minhaLista.Count; i++)
            {
                Console.WriteLine("[{0}]\t\t{1}\t\t{2}", i,
                                  minhaLista.GetKey(i), minhaLista.GetByIndex(i));
            }
            Console.WriteLine();
            // Depois de substituir chaves e valores
            Console.WriteLine("----- Depois de alterar -----");
            // Substitui os valores no index 1 e index 3
            minhaLista.SetByIndex(1, "Brasil");
            minhaLista.SetByIndex(3, "Argentina");
            Console.WriteLine("Index \t\t Keys \t\tValues");
            for (int i = 0; i < minhaLista.Count; i++)
            {
                Console.WriteLine("[{0}]\t\t{1}\t\t{2}", i,
                                  minhaLista.GetKey(i), minhaLista.GetByIndex(i));
            }
        }

Vemos no código a utililização de Count, GetKey(), GetByIndex() e SetByIndex().

Executando o código teremos:

Pegue o código do projeto aqui : CShp_SortedList1.zip

"E Jesus clamou, e disse: Quem crê em mim, crê, não em mim, mas naquele que me enviou.
E quem me vê a mim, vê aquele que me enviou.
Eu sou a luz que vim ao mundo, para que todo aquele que crê em mim não permaneça nas trevas."
João 12:44-46

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti