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.
Deixe um comentário