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.
Comentário de Wellington Guimaraes em 29 abril 2009 às 22:35
Comentário de Leandro Koiti em 30 abril 2009 às 11:51
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
© 2013 Criado por Gustavo Malheiros.
Você precisa ser um membro de PantaNet para adicionar comentários!
Entrar em PantaNet