Tag Archives: Arrays

C# – Mesclando Arrays (Merge Arrays)

Mais um código da classe “utilitária”. Como várias das funções do Framework ainda retornar nativamente arrays (lembrando que nas primeiras versões do .NET Framework, os Generics não existiam), é comum precisarmos unir Arrays de tipos primitivos, um trabalho nada usual e que atualmente com as listas tipadas tornaram-se bem mais fácil de fazer.

O problema é que geralmente temos que apelar a loops para fazer esse tipo de trabalho, o que acaba por “sujar” um pouco o código, já que esse tipo de tarefa não está vinculada a uma lógida de negócios, podendo ser classificada como um dificuldade técnica.

O código abaixo mostra um exemplo de como fazer o merge utilizando algumas funções auxiliares da classe Array:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
 
namespace MergeArrays
{
	public class Program
	{
		public static void Main(string[] args)
		{
			string[] filesInTemp = Directory.GetFiles(@"C:\temp");
			string[] filesInTem2 = Directory.GetFiles(@"C:\temp2");
			string[] allFiles = new string[filesInTemp.Length + filesInTem2.Length];
 
			filesInTemp.CopyTo(allFiles, 0);
			filesInTem2.CopyTo(allFiles, filesInTemp.Length);
 
			for (int i = 0; i < allFiles.Length; i++)
			{
				Console.WriteLine("{0} = {1}", i, allFiles[i]);
			}
 
			Console.Read();
		}
	}
}

No exemplo, o código usa o método GetFiles da classe Directory, que retorna um Array de string com os nomes dos arquivos (absoluto, ou seja, com a pasta e tudo) contidos na pasta informada. Dois arrays são montados com os arquivos de duas pastas. Em seguida, um terceiro array é criado com o trabalho dos dois arrays anteriormente preenchidos. O método CopyTo da classe Array faz a mágica de copiar o conteúdo para um novo Array, tomando o cuidado de mencionar o índice correto a partir de onde o Array deve copiar para não sobreescrever nenhum dado. No código, o primeiro copia seu contéudo a partir do índice 0 e o segundo a partir do tamanho (length) do segundo.

Assim, caso for necessário mesclar mais Arrays, o mesmo raciocício pode ser utilizado.

Bom proveito!

C# – Convertendo um Array de String em um String separada por vírgula

Mais uma da série: “tinha que ser mais simples”

Tudo bem que é algo meio atrevido e que inventei agora, mas algumas funções, mesmo meio “sujas”, são tão comumente necessárias no dia a dia que faria mais sentido fazerem parte dos métodos óbvios de um determinados frameworks.

Neste caso, falando em .NET, vamos ver uma forma simples de a partir de um array de strings, produzir uma única string com os itens do array separados por vírgula.

A necessidade apesar de parecer pouco óbvia, nasce de situações simples como interagir com sistemas legados. Um exemplo simples seria a geração de arquivos no padrão CSV, ou até mesmo sem precisar ir muito longe, montar a cláusula IN de uma consulta no padrão SQL.

Pois bem, o método que faz a proeza é o System.String.Join. O método estático requer dois parâmetros, sendo eles:

  • um string que conterá o texto que separará os itens do array
  • o array de strings

Veja um exemplo de código C# abaixo que roda em uma aplicação console:

1
2
3
string[] estacoes = new string[] { "Primavera", "Verão", "Outono", "Inverno" };
string result = String.Join(", ", estacoes);
Console.WriteLine(result);  // Saída: "Primavera, Verão, Outono, Inverno"

Bom, confirmando o protesto inicial, poderia ser mais simples certo?

Abraços

Tomás

C# – Comparando Arrays

Não tem jeito. Apesar da imensa blibloteca que o .NET Framework possui, ainda não há (pelo menos até onde consegui pesquisar) um método nativo para comparação de Arrays ou Coleções.

Como esta foi uma necessidade que tive mais de uma vez em sistemas dos quais participei na construção, publicarei um método genérico para comparação de Arrays simples em C#.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// Compara dois arrays de string
/// </summary>
/// <param name="arrayA">Array 1</param>
/// <param name="arrayB">Array 2</param>
/// <returns>True se os arrays forem iguais,
/// False do contrário</returns>
public static bool ArrayCompare(string[] arrayA, string[] arrayB)
{
	if (arrayA.Length != arrayB.Length)
	{
		return false;
	}
	for (int i = 0; i < arrayA.Length; i++)
	{
		if (arrayA[i] != arrayB[i])
		{
			return false;
		}
	}
	return true;
}

O código abaixo completo mostra a utilização da função:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
 
public class testCompareArrays
{
	public static void Main(string[] args)
	{
		string[] array1 = new string[] { "a", "b", "c", "d", "e" };
		string[] array2 = new string[] { "a", "b", "c", "d", "e" };
 
		if (ArrayCompare(array1, array2))
		{
			Console.WriteLine("Os arrays são iguais");
		}
		else
		{
			Console.WriteLine("Os arrays são diferentes");
		}
	}
 
	/// <summary>
	/// Compara dois arrays de string
	/// </summary>
	/// <param name="arrayA">Array 1</param>
	/// <param name="arrayB">Array 2</param>
	/// <returns>True se os arrays forem iguais,
	/// False do contrário</returns>
	public static bool ArrayCompare(string[] arrayA, string[] arrayB)
	{
		if (arrayA.Length != arrayB.Length)
		{
			return false;
		}
		for (int i = 0; i < arrayA.Length; i++)
		{
			if (arrayA[i] != arrayB[i])
			{
				return false;
			}
		}
		return true;
	}
}

O exemplos faz uso de um array de strings, porém é simples alterá-lo para qualquer outro tipo, desde que seja nativo ou que sobrecarregue o operado ==.

Bom proveito!

Tomás