PantaNet

Estou usando o livro C# 3.0 Cookbook que ganhei durante o Pantanet Seminars I e ao procurar algumas receitas, vi que elas não constavam no livro, então resolvi publicar essas receitas nos mesmos moldes do livro. Claro que elas não serão tão didáticas e discutidas como no livro, mas o que vale é a intenção. Então o didatismo e a discussão dependerá dos comentários e dúvidas postados.


Como mesclar 2 vetores


Quando você tem um array e quer mesclar (unir) com outro array, não existe um método para isso como numa Lista, por exemplo, então é necessário fazer uma gambiarra. Nesta receita tenho 2 arrays a1 e a2, e quero uni-los no array a3:


string[] a1 = { "dog", "dock", "deer" };
string[] a2 = { "lion", "tiger" };


string[] a3 = new string[a1.Length + a2.Length];
a1.CopyTo(a3, 0);
a2.CopyTo(a3, a1.Length);


Simples e conciso.
Outro caso poderia ser se você quisesse unir a2 a a1, como no C# não há como redimensionar arrays dinamicamente como no VB.Net, ou você pode atribuir a3 a a1, ou então usar uma função auxiliar para redimensionar a1 e depois copiar os valores de a2 para a1, como abaixo:


int pos = a1.Length;
a1 = RedimArray(a1, a1.Length + a2.Length);
a2.CopyTo(a1, pos);


Abaixo uma função para expandir arrays:


/// <summary>
/// Realoca um vetor com um novo tamanho, e copia seu
/// conteúdo para o novo vetor.
/// </summary>
/// <param name="oldArray">o vetor antigo, a ser realocado.</param>
/// <param name="newSize">o tamanho do novo vetor.</param>
/// <returns>Um novo vetor com o mesmo conteúdo.</returns>

public static System.Array RedimArray(System.Array vetor, int novoTamanho)
{
int tamanhoAnt = vetor.Length;
System.Type tipo = vetor.GetType().GetElementType();
System.Array novoVetor = System.Array.CreateInstance(tipo, novoTamanho);
int tamanho = System.Math.Min(tamanhoAnt, novoTamanho);
if (tamanho > 0)
System.Array.Copy(vetor, novoVetor, tamanho);
return novoVetor;
}


Porém caso fosse necessário fazer muitos redimensionamentos é recomendado usar uma Lista ou alguma outra coleção, especialmente se os vetores forem grandes ou com objetos de grande tamanho.



Exibições: 91

Comentário de Wellington Guimaraes em 29 abril 2009 às 22:35
Acho mais razoável fazer um método void extendendo a System.Array, uma vez que quando se deseja expandir um array, de maneira alguma se pensa em produzir uma cópia redimensionada, apenas em modificar o array em questao e mante-lo em uso.

O protótipo proposto seria:

public static void Resize(this System.Array array, int newSize)
Comentário de Leandro Koiti em 30 abril 2009 às 11:51
ow Wellington, sua idéia parece ser boa, como você pretende redimensionar o array passado sem criar uma cópia? fiquei curioso porque achei que não fosse possível fazer em C#, se tiver como passar a implementação do seu código pra gente vai ser legal =D
[]s
Comentário de Emerson SS em 18 setembro 2012 às 10:26

Redimensionar vetor de forma genérica:

/// <summary>
/// Redimensionar Vetor
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="v1"></param>
/// <param name="v2"></param>
/// <returns></returns>
/// <remarks>author: Emerson Shigueo Sugimoto</remarks>
private T[] redimensionar<T>(T[] v1, T[] v2) {
if ((v1 == null || v1.Length <= 0) && (v2 == null || v2.Length <= 0)) { return v1 ?? v2; }
if (v1 == null || v1.Length <= 0) { return v2; }
if (v2 == null || v2.Length <= 0) { return v1; }
T[] retorno = new T[v1.Length + v2.Length];
v1.CopyTo(retorno, 0);
v2.CopyTo(retorno, v1.Length);
return retorno;
}

Para usar:

//vetor..
string[] v1 = {"Este", "é", "o", "meu"};
string[] v2 = { "vetor", "!", "Redimensionado", "?"};

string[] v3 = redimensionar<string>(v1, v2);
print(v3);

Exemplo de print:

private void print(string[] v) {
litCallMensagem.Text = "";
if (v == null || v.Length <= 0) { return; }
for (int i = 0; i < v.Length; i++) {
litCallMensagem.Text += v[i] + " ";
}
}

Comentar

Você precisa ser um membro de PantaNet para adicionar comentários!

Entrar em PantaNet

Fotos

Carregando...
  • Adicionar fotos
  • Exibir todos

Apoio





 

© 2013   Criado por Gustavo Malheiros.

Badges  |  Relatar um incidente  |  Termos de serviço