본문 바로가기

공방/학습 일지

[ .NET ] c#에서 데이터 변환 및 정렬 활용하기

C#에서 데이터 형식을 상황에 맞게 적합한 데이터로 형식을 변환해주어야 합니다

클래스와 메서드 또는 캐스팅으로 데이터 캐스트 및 형식 변환을 할 수 있습니다

 

또한 사용하는 데이터를 배열에 담거나 특수한 문자 서식을 갖는 데이터를

형식에 맞는 메서드를 통해 추출, 제거 및 수정함으로써 활용할 수 있습니다

 

 

Convert 클래스를 사용하여 문자열을 숫자로 변환하기

float 형식은 없지만, byte, int, decimal 등등 여러 가지 형식으로의 변환을 지원합니다

string value1 = "5";
string value2 = "7";
int result = Convert.ToInt32(value1) * Convert.ToInt32(value2);
Console.WriteLine(result);

output : 
35

 

캐스팅 연산자로 데이터 형식 변환하기

decimal mydecimal = 1.123123611111m;
Console.WriteLine($"decimal: {mydecimal}");

float myFloat = (float)mydecimal;
Console.WriteLine($"float: {myFloat}");

output : 
decimal: 1.123123611111
float: 1.123124

 

ToString() 메서드를 사용하여 문자열로 변환하기

int first = 5;
int second = 7;
string message = first.ToString() + second.ToString();
Console.WriteLine(message);

output : 
57

 

Parse() 메서드를 사용하여 문자를 숫자로 변환하기

문자열에서 숫자 형식의 데이터를 추출하는 기능입니다

int, float, decimal, double 등등 거의 모든 숫자 형식을 지원합니다

string first = "5";
string second = "7";
int sum = int.Parse(first) + int.Parse(second);
Console.WriteLine(sum);

output : 
12

 

TryParse() 메서드로 변환하기

문자열 배열에서 숫자와 문자를 구별하여 성공 여부와 매개변수를 출력합니다

성공한 경우, 변환된 값을 out 매개 변수로 출력한다

성공 여부를 나타내는 bool 값을 반환한다

// 예시1 
string[] values = { "12.3", "45", "ABC", "11", "DEF" };

string strVal1 = string.Empty;
double intVal1 = 0;

foreach(var value in values) 
{
    double val = 0;
    
    if(double.TryParse(value, out val))
    {
        intVal1 += val;
    }
    else 
    {
        strVal1 += value.ToString();
    }        
}

Console.WriteLine("Message: " + strVal1);
Console.WriteLine("Total: " + intVal1);

output : 
Message: ABCDEF
Total: 68.3

 

// 예시2
int value1 = 12;
decimal value2 = 1.4418604651162790697674418605m;
float value3 = 0.3583333f;

int val1 = 0;
decimal val2 = 0;
float val3 = 0;

if(int.TryParse(value1.ToString(), out val1)) 
{
    string result1 = (value1/val1).ToString();
    Console.WriteLine($"int: {result1}");
}

if(decimal.TryParse(value2.ToString(), out val2))
{
    string result2 = val2.ToString();
    Console.WriteLine($"decimal: {result2}");
}

if(float.TryParse(value3.ToString(), out val3))
{
    string result3 = val3.ToString();
    Console.WriteLine($"float: {result3}");
}

 

 

tip.

기본 제공 형식
"https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/built-in-types"
.NET 형식의 변환표
"https://docs.microsoft.com/ko-kr/dotnet/standard/base-types/conversion-tables"
tip.
데이터를 변환할 때 축소 변환과 확대 변환이 수행되는데 
특히 캐스팅 형식으로 데이터를 변환할 경우 데이터 손실의 위험을 인지해야 한다

Console.WriteLine((decimal)1.232132112323232 );
Console.WriteLine(1.232132112323232m);

output : 
1.23213211232323
1.232132112323232

 

 

배열에서 항목 지우기

Array 클래스의 Clear 메서드에 매개변수를 각각( 처리할 배열, 시작 지점, 마지막 지점) 순서로 넣어주면 됩니다

string[] pallets = { "B14", "A11", "B12", "A13" };

Array.Clear(pallets, 0, 2);

int i = 0;
foreach (var pallet in pallets)
{
    Console.WriteLine($"pallets {i} / {pallet}");
    i++;
}

output : 
pallets 0 / 
pallets 1 / 
pallets 2 / B12
pallets 3 / A13

 

tip. 
$"pallets[0] 값은 null 값이기 때문에 불러올 경우 오류가 발생할 수 있습니다
그러므로 예외처리를 해줘야 되는데 null 값인지 확인하는 구문을 넣어주면 오류를 해결할 수 있습니다"

// 예시1
if (pallets[0] != null)
    Console.WriteLine($"After: {pallets[0].ToLower()}");

 

배열 크기 조절하기

데이터를 생성하고 Array 클래스의 Resize 메서드에 매개변수를 각각( ref 처리할 배열, 크기) 순서로 넣어주면 됩니다

만약 입력한 크기 값이 최초 배열 길이보다 크다면 데이터가 삭제될 수 있음에 주의해야 합니다

또한 삭제되거나 증가된 배열 값은 null입니다

string[] pallets = { "A1", "A2", "B1", "A2" };
Console.WriteLine($"Before : {pallets.Length}");

Array.Resize(ref pallets, 6);
Console.WriteLine($"After : {pallets.Length}");

pallets[4] = "C01";
pallets[5] = "C02";

int i =0;
foreach (var pallet in pallets)
{
    Console.WriteLine($"{i} {pallet}");
    i++;
}

output : 
Before : 4
After : 6
0 A1
1 A2
2 B1
3 A2
4 C01
5 C02

 

배열 정방향 역방향 정렬하기 ( ToCharArray(), Array.Reverse(), String.Join() )

// 정방향
string value = "abc123";
char[] valueArray = value.ToCharArray();
string result = new string(valueArray);
Console.WriteLine(result);

// 역방향
Array.Reverse(valueArray);
result = new string(valueArray);
Console.WriteLine(result);

// 콤마찍기 정방향
string value1 = "abc123";
char[] valueArray1 = value1.ToCharArray();
result = String.Join(",", valueArray1);
Console.WriteLine(result);

// 콤마찍기 역방향
Array.Reverse(valueArray1);
result = String.Join(",", valueArray1);
Console.WriteLine(result);

output : 
abc123
321cba
a,b,c,1,2,3
3,2,1,c,b,a

 

문자열 배열 분할하기

result 변수에 문자열 "A1, A2, A3,1,2"이 들어있습니다

이 문자열에 포함된 콤파(,)를 기준으로 Char 형식으로 데이터를 쪼갤 수 있습니다

기준은 콤파가 아니어도 되며 문자열은 큰따옴표("")로 문자는 작은따옴표('')로 나타낼 수 있습니다

string result = "A1,A2,A3,1,2";
Console.WriteLine(result);

string[] items = result.Split(',');
foreach (string item in items)
{
    Console.WriteLine(item);
}

output : 
A1,A2,A3,1,2
A1
A2
A3
1
2

 

정렬 활용하기

지금까지 알아본 문법을 활용하여, 문자열의 역방향 정렬과 단어별 역방향 정렬을 구현해보았습니다

보기에는 단순해 보이지만 의외로 오류가 많이 발생하며 확실하게 모를 경우 많은 오류가 발생할 수 있습니다

직접 한번 해보시고 여러 가지 방법으로 시도하면서 익숙해지시는 것을 권합니다

// 예시1
string str = "The quick brown fox jumps over the lazy dog";
Console.WriteLine("정렬 처리 할 문장  : " + str);

char[] charArray = str.ToCharArray();
Array.Reverse(charArray);
string strReverse = new string(charArray);
Console.WriteLine("단순한 역방향 정렬 : " + strReverse);

string[] data = strReverse.Split(' ');
Array.Reverse(data);
//var data1 = data.Reverse();
var data1 = String.Join(" ", data);

Console.WriteLine("단어별 역방향 정렬 : " + data1);

output : 
정렬 처리 할 문장  : The quick brown fox jumps over the lazy dog
단순한 역방향 정렬 : god yzal eht revo spmuj xof nworb kciuq ehT
단어별 역방향 정렬 : ehT kciuq nworb xof spmuj revo eht yzal god

 

// 예시2 
string pangram = "The quick brown fox jumps over the lazy dog";

string[] message = pangram.Split(' ');
string[] newMessage = new string[message.Length];

for (int i = 0; i < message.Length; i++)
{
    char[] letters = message[i].ToCharArray();
    Array.Reverse(letters);
    newMessage[i] = new string(letters);
}

string result = String.Join(" ", newMessage);
Console.WriteLine(result);

output : 
ehT kciuq nworb xof spmuj revo eht yzal god

 

원하는 문자 골라서 출력하기 ( Contains() )

문자열 "B"가 포함된 값을 찾아서 출력하는 코드입니다

예시 1의 경우 해당 문자열에 "B"가 포함되면 출력하고, 예시 2의 경우 "B"로 시작하는 문자열을 출력합니다

// 예시1
string orderStream = "B123,C234,A345,C15,B177,G3003,C235,B179";
string[] data = orderStream.Split(',');

foreach(var val in data) 
{
    if(val.Contains("B"))
        Console.WriteLine(val);
}

output : 
B123
B177
B179

 

// 예시2
string orderStream = "B123,C234,A345,C15,B177,G3003,C235,B179";
string[] items = orderStream.Split(',');

foreach (var item in items)
{
    if (item.StartsWith("B"))
    {
        Console.WriteLine(item);
    }
}

output : 
B123
B177
B179