클래스, 구조체 등 내부 값이 있는 경우에 IComparer<T> 를 이용하여 비교하여 정렬이 가능합니다.
using System;
using System.Collections.Generic;
namespace ConsoleApp
{
class Program
{
class DescCompare : IComparer<Data>
{
//작으면 -1, 같으면 0, 크면 1
//반대인 경우는 Asc 가능
public int Compare(Data data1, Data data2)
{
return data1.A < data2.A ? -1 : 1;
}
}
class Data
{
public int A { get; set; }
public string B { get; set; }
}
static void PrintList (List<Data> datas, string message)
{
Console.WriteLine(message);
foreach (Data data in datas)
{
Console.WriteLine(string.Format("{0}) {1}", data.A, data.B));
}
}
public static void Main(string[] args)
{
List<Data> datas = new List<Data>();
datas.Add(new Data { A = 30, B = "Test30" });
datas.Add(new Data { A = 20, B = "Test20" });
datas.Add(new Data { A = 10, B = "Test10" });
PrintList(datas, "정렬 전");
datas.Sort(new DescCompare());
PrintList(datas, "정렬 후");
}
}
}
public 리턴타입 this [타입 변수명] 으로 시작합니다. (int, string 모두 가능합니다!)
(복잡해질 수 있어 안쓰겠거니 했는데 많은 변수에 값을 할당할 때
일일히 값 체크를 하며 하드코딩 하는 형태가 되는데 사용해보니 조금 더 머리가 덜 아픈 느낌이 듭니다.)
using System;
namespace ConsoleApp2
{
class A
{
public int a;
public int b;
public int c;
public int this [int index] //인덱서 설정 indexer
{
get
{
switch (index)
{
case 0:
return a;
case 1:
return b;
case 2:
return c;
default:
return 0;
}
}
set
{
switch (index)
{
case 0:
a = value;
break;
case 1:
b = value;
break;
case 2:
c = value;
break;
default:
break;
}
}
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
int[] values = { 33, 28, 90 };
for (int i = 0; i < 3; ++i)
{
a[i] = values[i]; //indexer set
Console.WriteLine(a[i]); //indexer get
}
Console.WriteLine("a = {0}, a[0] = {1}", a.a, a[0]);
Console.WriteLine("b = {0}, a[1] = {1}", a.b, a[1]);
Console.WriteLine("c = {0}, a[2] = {1}", a.c, a[2]);
}
}
}
using System;
using System.Collections;
namespace ConsoleApp
{
class Program
{
public static void Main(string[] args)
{
int? a = null;
Console.WriteLine("a의 값 {0}", a);
float? b = null;
Console.WriteLine("b의 값 {0}", b);
ArrayList arraylist = null;
arraylist?.Add(30); //arraylist가 null이 아니면 Add(30)
/*
if (arraylist == null)
{
arraylist.Add(30);
}
*/
Console.WriteLine(arraylist?[0]); //null 이지만 오류가 나지 않습니다.
a = a ?? 20; //a가 null이면 20
b = b ?? 30.9f; //b가 null 이면 30.9f
Console.WriteLine("a = {0}, b = {1}", a, b);
}
}
}
using System;
using System.IO; //...Stream
namespace ConsoleApp
{
class Program
{
public static void Main(string[] args)
{
//바이너리 파일 생성 및 저장
FileStream fs = new FileStream("Test.bin", FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
string input1 = Console.ReadLine();
int input2 = Convert.ToInt32(Console.ReadLine());
float input3 = Convert.ToSingle(Console.ReadLine());
bw.Write(input1); //string
bw.Write(input2); //int
bw.Write(input3); //float
bw.Close();
fs.Close();
//바이너리 파일 읽어오기
FileStream fs2 = new FileStream("Test.bin", FileMode.Open);
BinaryReader br = new BinaryReader(fs2);
Console.WriteLine(br.ReadString()); //string
Console.WriteLine(br.ReadInt32()); //int
Console.WriteLine(br.ReadSingle()); //float
br.Close();
fs2.Close();
}
}
}
2. StreamReader/StreamWriter 를 이용한 모습입니다. 문자열 그대로 저장이 됩니다.
using System;
using System.IO; //...Stream
namespace ConsoleApp
{
class Program
{
public static void Main(string[] args)
{
StreamWriter sw = new StreamWriter("Test.dat");
for (int i = 0; i < 5; ++i) //5개의 입력
{
sw.WriteLine(Console.ReadLine());
}
sw.Close();
StreamReader sr = new StreamReader("Test.dat");
while (!sr.EndOfStream) //sr.ReadLine() == null인 경우입니다.
{
Console.WriteLine(sr.ReadLine());
}
sr.Close();
}
}
}