C# 문법-3

맛없는콩두유·2022년 10월 26일
0
post-thumbnail
post-custom-banner

프로퍼티와 생성자

클래스 간편하게 만들기



BankAccount account = new();

account.Name = "알지오";
Console.WriteLine($"{account.Name}의 계좌입니다.");
class BankAccount
{
    public string Name
    {
        set;
        get;
    }
}

->

알지오의 계좌입니다.


BankAccount account = new();

account.Name = "알지오";
Console.WriteLine($"{account.Name}의 계좌입니다.");

BankAccount account2 = new("alzio", "11111111", 10000);
Console.WriteLine($"{account2.Name}님의 계좌({account2.Number}가 생성되었습니다. " +
    $"잔액 : { account2.Balance}원");
class BankAccount
{
    public string Name
    {
        set;
        get;
    }
    public string Number
    {

        get;
    }
    public decimal Balance
    {

        get;
    }

    public BankAccount()
    {
        Console.WriteLine("새로운 빈 계좌아 생성되었습니다. " +
            "추가정보를 입력하세요.");
    }
    
    //생성자
    public BankAccount(string name, string number, decimal balance)
    {
        Name = name;
        Number = number;
        Balance = balance;
    }
}

->

새로운 빈 계좌아 생성되었습니다. 추가정보를 입력하세요.
알지오의 계좌입니다.
alzio님의 계좌(11111111가 생성되었습니다. 잔액 : 10000원

멤버 클래스

var member = new Member("alzio", "132345");
member.FindPassword("alzio");
class Member
{
    //readonly : 읽기전용
    // 생성자가 아닌 다른 함수에서 선언할 수 없다!
    private readonly string id;
    private readonly string password;

    //생성자
    public Member(string id, string password)
    {
        this.id = id;
        this.password = password;
    }

    public void FindPassword(string id)
    {
        if(this.id == id)
            {
                string shortPassword = password[..4] + "****";
                Console.WriteLine($"비밀번호는 {shortPassword}입니다.");
            }
        else
        {
            Console.WriteLine("해당 아이디를 찾을 수 없습니다.");
        }
    }
}

->

비밀번호는 1323****입니다.

정적 객체와 인덱서

열거형 자료형

//열거형


Console.WriteLine((int)Notes.A);

enum Notes { A = 50,B,C,D,E,F,G}

->

50

int[] note_numbers = { 4, 2, 2, 3, 1, 1, 0, 1, 2, 3, 4};

foreach (var item in note_numbers)
{
    Console.Write((Notes)item + " ");
}

enum Notes {도1, 레, 미, 파, 솔, 라, 시, 도2}

->

솔 미 미 파 레 레 도1 레 미 파 솔

클래스의 상속

클래스 상속

B b = new(); // B의 클래스 인스턴스b로 선언
Console.WriteLine(b.number);
b.Hello();

public class A
{
    public int number = 10; //멤버 변수
    public void Hello() // 멤버 함수
    {
        Console.WriteLine("Hello");
    }

}

public class B : A    //A라는 클래스를 상속 받겠다 
{

}

->

10
Hello

만약 class A 내에 멤버변수와 멤버 함수가 public이 아니라 private면 B클래스에서 접근이 불가능하다!!



//Success 중첩된 클래스 내에 있으면 private이라도 가능
public class Basic
{
    private int _number = 10;

    public class A : Basic
    {
        public int GetNum()
        {
            return _number;
        }
    }
}

//Error 중첩되어 있지 않으므로 불가능!
public class B : Basic
{
    public int GetNum()
    {
        return _number;
    }
}

private이라도 중첩된 클래스 내에 있으면 가능!


//Basic안에있는 A클래스의 멤버함수인
//GetNumber()의 return 값을 출력
var a = new Basic.A();
Console.WriteLine();
Console.WriteLine(a.GetNum()); 



//Success 중첩된 클래스 내에 있으면 private이라도 가능
public class Basic
{
    private int _number = 10;

    public class A : Basic
    {
        public int GetNum()
        {
            return _number;
        }
    }
}

->

10

B b = new();
b.Hello();

public class A
{
    public void Hello()
    {
        Console.WriteLine("Hello");
    }
}

public class B : A
{
    public new void Hello()
    {
        Console.WriteLine("Hello B");
    }

    public void Hello2()
    {
        Console.WriteLine("Hello B2");
    }
}

->

Hello B

상송받는 B클래스 내에 다른 값을 출력하고 싶을 때 B클래스 내에 반환형과 같은 이름의 클래스를 적고 new 키워드를 기입하면 된다!
또, 새로운 함수 Hello2도 작성가능하고 불러올 떈 b.Hello2()를 맨위에 적어주면 된다!

인스턴스 주의사항


//다형성 부모에서는 virtual, 자식에서는 override
Magazine magazine = new();
magazine.getTitle();
GetTitle(magazine);

void GetTitle(Book book)
{
    book.getTitle();
}

class Book
{
    public void getTitle()
    {
        Console.WriteLine("Book Title");
    }
}

class Magazine : Book
{
    public new void getTitle()
    {
        Console.WriteLine("Magazine Title");
    }
}

->

Magazine Title
Book Title

magazine.getTitle();는 자식의 Title을
GetTitle(magazine);는 부모의 Title을 출력한다. 이 떄 둘 다 자식의 타이틀을 출력하기 위해 다형성이 필요하다!



//다형성 부모에서는 virtual, 자식에서는 override
Magazine magazine = new();
magazine.getTitle();
GetTitle(magazine);

void GetTitle(Book book)
{
    book.getTitle();
}

class Book
{
    public virtual void getTitle()
    {
        Console.WriteLine("Book Title");
    }
}

class Magazine : Book
{
    public override void getTitle()
    {
        Console.WriteLine("Magazine Title");
    }
}

->


Magazine Title
Magazine Title

//다형성 부모에서는 virtual, 자식에서는 override
부모 : public virtual void getTitle()
자식 : public override void getTitle()


//Book book = new Book();
Book book = new Magazine();
//Book book = new Novel();

GetTitle(book);

void GetTitle(Book book)
{
    book.getTitle();
}

class Book
{
    public virtual void getTitle()
    {
        Console.WriteLine("Book Title");
    }
}

class Magazine : Book
{
    public override void getTitle()
    {
        Console.WriteLine("Magazine Title");
    }
}

class Novel : Book
{

}

->

1. //Book book = new Book(); 일 때 
	-> Book Title
    
2. //Book book = new Magazine(); 일 떄 
	-> Magazine Title
    
3. //Book book = new Novel(); 일 떄
	-> Book Title

protected

외부 접근은 불가능하나, 자식클래스에서는 접근 가능

B b = new();
Console.WriteLine(b.a); // error
Console.WriteLine(b.b);
Console.WriteLine(b.c); // error
class A
{
    private int a = 10;
    public int b = 20;
    protected int c = 30;
}

class B : A
{
    public void Hello()
    {
        Console.WriteLine(a); // error
        Console.WriteLine(b);
        Console.WriteLine(c);
    }
}

추상 및 제네릭 클래스

추상클래스


//추상 클래스는 추상 메서드를 사용한다
public abstract class A
{
    public abstract void Test(); //내용 따로 구현 X
}


Basil basil = new();
var mint = new Mint();

basil.Name();
mint.Name();

basil.Kindof();
mint.Kindof();

public abstract class Herb
{
    public abstract void Name();

    public void Kindof()
    {
        Console.WriteLine("허브 종 입니다.");
    }
}

public class Basil : Herb // 부모가 추상클래스인 경우 자식클래스의 메서드에 
{                           // 재정의한다는 override가 있어야 함!
    public override void Name()
    {
        Console.WriteLine("바질");
    }
}

public class Mint : Herb
{
    public override void Name()
    {
        Console.WriteLine("민트");
    }
}

->

바질
민트
허브 종 입니다.
허브 종 입니다.

인터페이스

//추상클래스와 인터페이스 모두 아무 내용이 없는 
//메서드를 적고 있기 때문에 상송받는 자식 클래스에서 
//이에 대한 내용을 꼭 적어줘야한다는 강제성이 부여된다.

var test = new Test();

test.A();
test.B();


public interface IMyInterface
{
    public void A();
    public void B();
}

public class Test : IMyInterface
{
    public void A()
    {
        Console.WriteLine("A입니다.");
    }
    public void B()
    {
        Console.WriteLine("B입니다.");
    }
}

->

A입니다.
B입니다.

제네릭

//자료형이 무엇이든 상관없이 우리가 입력한 자료형대로 출력된다!

int i = 10;
string s = "hello";

PrintValue(i, s);

void PrintValue<T1,T2>(T1 a, T2 b)
{
    Console.WriteLine($"입력한 값 : {a}, {b}");
}

->

입력한 값 : 10, hello

링크 작성하기

LINQ

// LINQ (Language Integrated Query)

int[] numbers = { 1, 8, 5, 2, 1, 6, 8, 4, 2 };

var query =
    from num in numbers
    where num % 2 == 0
    select num;

var query2 = numbers.Where(num => num % 2 == 0).Select(n => n*2);
var query3 = numbers.Where((num, i) => num > i);
foreach (var n in query)
{
    Console.Write(n + " ");
}

Console.WriteLine();

foreach (var n in query2)
{
    Console.Write(n + " ");
}

Console.WriteLine();

foreach (var n in query3)
{
    Console.Write(n + " ");
}

->

8 2 6 8 4 2
16 4 12 16 8 4
1 8 5 6 8

반지름으로 원의 넓이 계산하기

int[] radius = { 5, 10, 15, 20 };

var area = from r in radius
           select r * r * Math.PI;

var area2 = radius.Select(r => r * r * Math.PI);

Console.WriteLine("각 반지름의 원의 넓이");
foreach (var item in area2)
{
    Console.WriteLine($"{item:N3}");
}

->

각 반지름의 원의 넓이
78.540
314.159
706.858
1,256.637

쿼리사용 클래스


//새로운 클래스 생성
string[] fruits = { "Apple", "Banana", "Cherry" };

int id = 1;
var items = from f in fruits
            select new { ID = id++, Name = f.ToUpper() };

foreach (var item in items)
{
    Console.WriteLine($"ID : {item.ID}, Name : {item.Name}");
}

->

ID : 1, Name : APPLE
ID : 2, Name : BANANA
ID : 3, Name : CHERRY

Program.cs

  • Product.cs

//상품재고 확인하기
//Product.cs

namespace Csharp
{
    class Product
    {
        public string ID { get; set; }
        public int InStock { get; set; }
        public int Price { get; set; } = 0;

        public static List<Product> GetProducts()
        {
            List<Product> products = new()
            {
                new Product { ID = "A001", InStock = 0, Price = 4000 },
                new Product { ID = "A002", InStock = 8, Price = 5000 },
                new Product { ID = "A003", InStock = 9, Price = 7000 },
                new Product { ID = "B001", InStock = 0, Price = 5000 },
                new Product { ID = "B002", InStock = 2, Price = 25000 },
                new Product { ID = "B003", InStock = 0, Price = 12000 },
                new Product { ID = "C001", InStock = 5, Price = 5000 },
                new Product { ID = "C002", InStock = 0, Price = 15000 },
                new Product { ID = "C003", InStock = 6, Price = 8000 },
                new Product { ID = "D001", InStock = 3, Price = 5000 },
            };
            return products;
        }
    }

}
  • Program.cs
using Csharp;

List<Product> products = Product.GetProducts();
var unStock = from p in products
              where p.InStock == 0
              select p;

foreach (var item in unStock)
{
    Console.WriteLine($"{item.ID}번 재고 없음");
}

->

A001번 재고 없음
B001번 재고 없음
B003번 재고 없음
C002번 재고 없음

  • Program.cs
// 재고가격 확인
using Csharp;
List<Product> products = Product.GetProducts();
int sum = 0;

var inStock = from p in products
              where p.InStock != 0
              select p;

foreach (var item in products)
{
    sum += (item.InStock * item.Price);
}

Console.WriteLine($"재고 자산 : 총 {sum:C}원");

->

재고 자산 : 총 \241,000원

  • Program.cs
//select문으로 가격 계산

using Csharp;
List<Product> products = Product.GetProducts();
var info = from p in products
           select (p.ID, p.Price, Total: p.Price * p.InStock);

Console.WriteLine("제품 정보를 출력합니다");
foreach (var item in info)
{
    Console.WriteLine($"제품번호 : {item.ID}({item.Price:C}) \t재고자산 : {item.Total:C}");
}

->

제품 정보를 출력합니다
제품번호 : A001(\4,000)         재고자산 : \0
제품번호 : A002(\5,000)         재고자산 : \40,000
제품번호 : A003(\7,000)         재고자산 : \63,000
제품번호 : B001(\5,000)         재고자산 : \0
제품번호 : B002(\25,000)        재고자산 : \50,000
제품번호 : B003(\12,000)        재고자산 : \0
제품번호 : C001(\5,000)         재고자산 : \25,000
제품번호 : C002(\15,000)        재고자산 : \0
제품번호 : C003(\8,000)         재고자산 : \48,000
제품번호 : D001(\5,000)         재고자산 : \15,000

LINQ 조건문

여러 조건

  • Student.cs
namespace CSharp
{
    class Student
    {
        public string Name { get; set; }
        public int Grade { get; set; }
        public List<int> Scores;
        public static List<Student> GetStudents()
        {
            List<Student> students = new()
            {
                new Student { Name = "alzio1", Grade = 1, Scores = new List<int> { 100, 50, 78 } },
                new Student { Name = "alzio2", Grade = 2, Scores = new List<int> { 90, 90, 90 } },
                new Student { Name = "alzio3", Grade = 2, Scores = new List<int> { 56, 90, 45 } },
                new Student { Name = "alzio4", Grade = 1, Scores = new List<int> { 60, 58, 96 } },
                new Student { Name = "alzio5", Grade = 1, Scores = new List<int> { 89, 53, 71 } },
                new Student { Name = "alzio6", Grade = 3, Scores = new List<int> { 99, 53, 80 } },
                new Student { Name = "alzio7", Grade = 3, Scores = new List<int> { 77, 68, 45 } },
                new Student { Name = "alzio8", Grade = 1, Scores = new List<int> { 82, 100, 63 } },
                new Student { Name = "alzio9", Grade = 2, Scores = new List<int> { 99, 100, 97 } },
                new Student { Name = "alzio0", Grade = 1, Scores = new List<int> { 36, 51, 44 } }
            };
            return students;
        }
    }
}
  • Program.cs

using CSharp;

List<Student> students = Student.GetStudents();

var dataQuery =
    from s in students
    where s.Scores[0] >= 90 && s.Scores[1] >= 90 && s.Scores[2] >= 90
    select s;

foreach (var item in dataQuery)
{
    Console.WriteLine(item.Name);
}

->

alzio2
alzio9

가격순 정렬

  • Product.cs

//상품재고 확인하기
//Product.cs

namespace Csharp
{
    class Product
    {
        public string ID { get; set; }
        public int InStock { get; set; }
        public int Price { get; set; } = 0;

        public static List<Product> GetProducts()
        {
            List<Product> products = new()
            {
                new Product { ID = "A001", InStock = 0, Price = 4000 },
                new Product { ID = "A002", InStock = 8, Price = 5000 },
                new Product { ID = "A003", InStock = 9, Price = 7000 },
                new Product { ID = "B001", InStock = 0, Price = 5000 },
                new Product { ID = "B002", InStock = 2, Price = 25000 },
                new Product { ID = "B003", InStock = 0, Price = 12000 },
                new Product { ID = "C001", InStock = 5, Price = 5000 },
                new Product { ID = "C002", InStock = 0, Price = 15000 },
                new Product { ID = "C003", InStock = 6, Price = 8000 },
                new Product { ID = "D001", InStock = 3, Price = 5000 },
            };
            return products;
        }
    }

}
  • Program.cs
using Csharp;

List<Product> products = Product.GetProducts();
var ordering = from p in products
               orderby p.Price
               select p;

Console.WriteLine("가격 순 정렬");
foreach (var item in ordering)
{
    Console.WriteLine($"{item.ID} : {item.Price:C}");
}

->

가격 순 정렬
A001 : \4,000
A002 : \5,000
B001 : \5,000
C001 : \5,000
D001 : \5,000
A003 : \7,000
C003 : \8,000
B003 : \12,000
C002 : \15,000
B002 : \25,000

정렬조건 추가

순서 정렬 조건 2개

  • Product.cs
namespace Csharp
{
    class Product
{
    public string ID { get; set; }
    public string Category { get; set; }
    public int Price { get; set; } = 0;

    public static List<Product> GetProducts()
    {
        List<Product> products = new()
            {
                new Product { ID = "A001", Category = "Clothes", Price = 4000 },
                new Product { ID = "A002", Category = "Book", Price = 5000 },
                new Product { ID = "A003", Category = "Food", Price = 7000 },
                new Product { ID = "B001", Category = "Clothes", Price = 5000 },
                new Product { ID = "B002", Category = "Food", Price = 25000 },
                new Product { ID = "B003", Category = "Clothes", Price = 12000 },
                new Product { ID = "C001", Category = "Food", Price = 5000 },
                new Product { ID = "C002", Category = "Book", Price = 15000 },
                new Product { ID = "C003", Category = "Clothes", Price = 8000 },
                new Product { ID = "D001", Category = "Book", Price = 5000 },
            };
        return products;
    }
}
}
  • Program.cs

using Csharp;

List<Product> products = Product.GetProducts();
var ordering = from p in products
               orderby p.Category, p.Price
               select p;

Console.WriteLine("카테고리별 가격 순 정렬");
foreach (var item in ordering)
{
    Console.WriteLine($"<{item.Category}> {item.ID} : {item.Price:C}");
}

->

카테고리별 가격 순 정렬
<Book> A002 : \5,000
<Book> D001 : \5,000
<Book> C002 : \15,000
<Clothes> A001 : \4,000
<Clothes> B001 : \5,000
<Clothes> C003 : \8,000
<Clothes> B003 : \12,000
<Food> C001 : \5,000
<Food> A003 : \7,000
<Food> B002 : \25,000

group by (into) 사용하기

  • Product.cs
namespace Csharp
{
    class Product
{
    public string ID { get; set; }
    public string Category { get; set; }
    public int Price { get; set; } = 0;

    public static List<Product> GetProducts()
    {
        List<Product> products = new()
            {
                new Product { ID = "A001", Category = "Clothes", Price = 4000 },
                new Product { ID = "A002", Category = "Book", Price = 5000 },
                new Product { ID = "A003", Category = "Food", Price = 7000 },
                new Product { ID = "B001", Category = "Clothes", Price = 5000 },
                new Product { ID = "B002", Category = "Food", Price = 25000 },
                new Product { ID = "B003", Category = "Clothes", Price = 12000 },
                new Product { ID = "C001", Category = "Food", Price = 5000 },
                new Product { ID = "C002", Category = "Book", Price = 15000 },
                new Product { ID = "C003", Category = "Clothes", Price = 8000 },
                new Product { ID = "D001", Category = "Book", Price = 5000 },
            };
        return products;
    }
}
}
  • Program.cs
using ConsoleApp5;
List<Product> products = Product.GetProducts();

var query= from p in products
               group p by p.Category into g
               select (Category : g.Key, Product : g);

Console.WriteLine("카테고리별 그룹 출력");
foreach (var item in query)
{
    Console.WriteLine($"<{item.Category}>");
    foreach (var p in item.Product)
        Console.WriteLine(p.ID);
}

->

카테고리별 그룹 출력
<Clothes>
A001
B001
B003
C003
<Book>
A002
C002
D001
<Food>
A003
B002
C001

새로운 클래스

  • Order.cs
namespace Csharp
{
    class Order
    {
        public string OrderNumber { get; set; }
        public string ProductID { get; set; }
        public int Amount { get; set; } = 0;
        public int TotalPrice { get; set; } = 0;
        public static List<Order> GetOrders()
        {
            List<Order> orders = new()
            {
                new Order { OrderNumber = "A03125", ProductID = "C003", Amount = 4 },
                new Order { OrderNumber = "A03285", ProductID = "B002", Amount = 2 },
                new Order { OrderNumber = "A03702", ProductID = "A003", Amount = 3 },
                new Order { OrderNumber = "A02155", ProductID = "A002", Amount = 1 },
                new Order { OrderNumber = "A04605", ProductID = "A003", Amount = 1 },
                new Order { OrderNumber = "A02845", ProductID = "C003", Amount = 2 },
                new Order { OrderNumber = "A02962", ProductID = "D001", Amount = 3 },
                new Order { OrderNumber = "A04760", ProductID = "B001", Amount = 3 },
                new Order { OrderNumber = "A09350", ProductID = "B002", Amount = 2 },
                new Order { OrderNumber = "A04722", ProductID = "B001", Amount = 4 },
                new Order { OrderNumber = "A04628", ProductID = "C003", Amount = 1 }
         };
            return orders;
        }
    }
}
  • Program.cs

using Csharp;

List<Order> orders = Order.GetOrders();

var orderResult = from o in orders
                  group o by o.ProductID into g
                  orderby g.Key
                  select g;

foreach (var item in orderResult)
{
    Console.Write($"{item.Key} :");
    foreach (var id in item)
    {
        Console.Write(id.OrderNumber + " ");
    }
    Console.WriteLine();
}

->

A002 :A02155
A003 :A03702 A04605
B001 :A04760 A04722
B002 :A03285 A09350
C003 :A03125 A02845 A04628
D001 :A02962

합격불합격 출력

  • Student.cs
namespace CSharp
{
    class Student
    {
        public string Name { get; set; }
        public int Grade { get; set; }
        public List<int> Scores;
        public static List<Student> GetStudents()
        {
            List<Student> students = new()
            {
                new Student { Name = "alzio1", Grade = 1, Scores = new List<int> { 100, 50, 78 } },
                new Student { Name = "alzio2", Grade = 2, Scores = new List<int> { 90, 90, 90 } },
                new Student { Name = "alzio3", Grade = 2, Scores = new List<int> { 56, 90, 45 } },
                new Student { Name = "alzio4", Grade = 1, Scores = new List<int> { 60, 58, 96 } },
                new Student { Name = "alzio5", Grade = 1, Scores = new List<int> { 89, 53, 71 } },
                new Student { Name = "alzio6", Grade = 3, Scores = new List<int> { 99, 53, 80 } },
                new Student { Name = "alzio7", Grade = 3, Scores = new List<int> { 77, 68, 45 } },
                new Student { Name = "alzio8", Grade = 1, Scores = new List<int> { 82, 100, 63 } },
                new Student { Name = "alzio9", Grade = 2, Scores = new List<int> { 99, 100, 97 } },
                new Student { Name = "alzio0", Grade = 1, Scores = new List<int> { 36, 51, 44 } }
            };
            return students;
        }
    }
}
  • Program.cs

using CSharp;

List<Student> students = Student.GetStudents();

var testResult = from s in students
                 group s by s.Scores.Average() >= 80 into pass
                 select (Result: pass.Key, AvgScore: pass);

foreach (var item in testResult)
{
    Console.WriteLine(item.Result ? "합격" : "불합격");
    foreach (var student in item.AvgScore)
    {
        Console.WriteLine($"{student.Name} : {student.Scores.Average():N}점");
    }
}

->

불합격
alzio1 : 76.00점
alzio3 : 63.67점
alzio4 : 71.33점
alzio5 : 71.00점
alzio6 : 77.33점
alzio7 : 63.33점
alzio0 : 43.67점
합격
alzio2 : 90.00점
alzio8 : 81.67점
alzio9 : 98.67점

LINQ 집합 다루기

여러 개의 KEY 값 사용

  • Student.cs
namespace CSharp
{
    class Student
    {
        public string Name { get; set; }
        public int Grade { get; set; }
        public List<int> Scores;
        public static List<Student> GetStudents()
        {
            List<Student> students = new()
            {
                new Student { Name = "alzio1", Grade = 1, Scores = new List<int> { 100, 50, 78 } },
                new Student { Name = "alzio2", Grade = 2, Scores = new List<int> { 90, 90, 90 } },
                new Student { Name = "alzio3", Grade = 2, Scores = new List<int> { 56, 90, 45 } },
                new Student { Name = "alzio4", Grade = 1, Scores = new List<int> { 60, 58, 96 } },
                new Student { Name = "alzio5", Grade = 1, Scores = new List<int> { 89, 53, 71 } },
                new Student { Name = "alzio6", Grade = 3, Scores = new List<int> { 99, 53, 80 } },
                new Student { Name = "alzio7", Grade = 3, Scores = new List<int> { 77, 68, 45 } },
                new Student { Name = "alzio8", Grade = 1, Scores = new List<int> { 82, 100, 63 } },
                new Student { Name = "alzio9", Grade = 2, Scores = new List<int> { 99, 100, 97 } },
                new Student { Name = "alzio0", Grade = 1, Scores = new List<int> { 36, 51, 44 } }
            };
            return students;
        }
    }
}
  • Program.cs

using CSharp;

List<Student> students = Student.GetStudents();

var orderByGrade = from student in students
                   group student by new
                   {
                       Grade = student.Grade,
                       Over80 = student.Scores.Average() > 80
                   } into g
                   orderby g.Key.Grade
                   select g;

foreach (var item in orderByGrade)
{
    if (item.Key.Over80)
    {
        Console.WriteLine($"{item.Key.Grade}학년");
        foreach (var s in item)
        {
            Console.WriteLine(s.Name);
        }
        Console.WriteLine();
    }
}

->

1학년
alzio8

2학년
alzio2
alzio9

group 중첩

  • Student.cs
namespace CSharp
{
    class Student
    {
        public string Name { get; set; }
        public int Grade { get; set; }
        public List<int> Scores;
        public static List<Student> GetStudents()
        {
            List<Student> students = new()
            {
                new Student { Name = "alzio1", Grade = 1, Scores = new List<int> { 100, 50, 78 } },
                new Student { Name = "alzio2", Grade = 2, Scores = new List<int> { 90, 90, 90 } },
                new Student { Name = "alzio3", Grade = 2, Scores = new List<int> { 56, 90, 45 } },
                new Student { Name = "alzio4", Grade = 1, Scores = new List<int> { 60, 58, 96 } },
                new Student { Name = "alzio5", Grade = 1, Scores = new List<int> { 89, 53, 71 } },
                new Student { Name = "alzio6", Grade = 3, Scores = new List<int> { 99, 53, 80 } },
                new Student { Name = "alzio7", Grade = 3, Scores = new List<int> { 77, 68, 45 } },
                new Student { Name = "alzio8", Grade = 1, Scores = new List<int> { 82, 100, 63 } },
                new Student { Name = "alzio9", Grade = 2, Scores = new List<int> { 99, 100, 97 } },
                new Student { Name = "alzio0", Grade = 1, Scores = new List<int> { 36, 51, 44 } }
            };
            return students;
        }
    }
}
  • Program.cs
List<Order> orders = Order.GetOrders();

var order = from o in orders
            group o by o.Amount into g1
            orderby g1.Key
            from inner in (
                from a in g1
                group a by a.ProductID[0] into g2
                orderby g2.Key
                select g2
                )
            group inner by g1.Key;
              

foreach (var o in order)
{
    Console.WriteLine($"구매수량 : {o.Key}개");
    foreach (var i in o)
    {
        foreach (var item in i)
            Console.WriteLine($"{item.ProductID} : {item.OrderNumber}");
        Console.WriteLine();
    }

}

->

구매수량 : 1개
A002 : A02155
A003 : A04605

C003 : A04628

구매수량 : 2개
B002 : A03285
B002 : A09350

C003 : A02845

구매수량 : 3개
A003 : A03702

B001 : A04760

D001 : A02962

구매수량 : 4개
B001 : A04722

C003 : A03125

Take

  • Student.cs 포함
  • Program.cs
// 상위 다섯개만 출력
using CSharp;

List<Student> students = Student.GetStudents();

var testResult = (from s in students
                  orderby s.Scores.Average() descending
                  select s).Take(5);

foreach (var item in testResult)
{
    Console.WriteLine($"{item.Name} : {item.Scores.Average():N}점");
}

->

alzio9 : 98.67점
alzio2 : 90.00점
alzio8 : 81.67점
alzio6 : 77.33점
alzio1 : 76.00점

TakeWhile

  • Program.cs
//TakeWhile
int[] numbers = { 6, 9, 10, 5, 8, 3, 7, 2, 13 };

var untilFalse = numbers.TakeWhile(n => n >= 5);

Console.WriteLine("숫자가 5보다 큰 경우 계속해서 반환");
foreach (var item in untilFalse)
{
    Console.WriteLine(item);
}

->

숫자가 5보다 큰 경우 계속해서 반환
6
9
10
5
8

Skip

  • Program.cs
//Skip
int[] numbers = { 6, 9, 10, 5, 8, 3, 7, 2, 13 };

var after5num = numbers.Skip(5);

Console.WriteLine("앞의 5개를 제외한 나머지 숫자 : ");
foreach (var n in after5num)
{
    Console.Write(n + " ");
}

->

앞의 5개를 제외한 나머지 숫자 :
3 7 2 13

SkipWhile

  • Program.cs
//SkipWhile
int[] numbers = { 6, 8, 10, 5, 9, 3, 7, 2, 13 };

var fromFalse = numbers.SkipWhile(n => n % 2 == 0);

Console.WriteLine("2의 배수가 아닌것부터 출력하기");
foreach (var item in fromFalse)
{
    Console.WriteLine(item);
}

->

2의 배수가 아닌것부터 출력하기
5
9
3
7
2
13

Union/Intersect/Distint

  • Program.cs
//union  (합집합)
int[] setA = { 2, 5, 6, 7, 9, 2, 5, 5 };
int[] setB = { 1, 3, 5, 6, 9 };

var setC = setA.Union(setB);

foreach (var item in setC)
{
    Console.WriteLine(item);
}

->

2
5
6
7
9
1
3

  • Program.cs
//Intersect (교집합)
int[] setA = { 2, 5, 6, 7, 9 };
int[] setB = { 1, 3, 5, 6, 9 };

var intersection = setA.Intersect(setB);
//var intersection = from a in setA
//                   from b in setB
//                   where a == b
//                   select a;

Console.WriteLine("A와 B의 교집합");
foreach (var item in intersection)
{
    Console.Write(item + " ");
}

->

A와 B의 교집합
5 6 9

  • Program.cs
//Distint (중복제거)
int[] setA = { 2, 5, 6, 7, 9, 2, 5, 5 };

var setB = setA.Distinct();

foreach (var item in setB)
{
    Console.WriteLine(item);
}

->

2
5
6
7
9

  • Product.cs
namespace Csharp
{
    class Product
{
    public string ID { get; set; }
    public string Category { get; set; }
    public int Price { get; set; } = 0;

    public static List<Product> GetProducts()
    {
        List<Product> products = new()
            {
                new Product { ID = "A001", Category = "Clothes", Price = 4000 },
                new Product { ID = "A002", Category = "Book", Price = 5000 },
                new Product { ID = "A003", Category = "Food", Price = 7000 },
                new Product { ID = "B001", Category = "Clothes", Price = 5000 },
                new Product { ID = "B002", Category = "Food", Price = 25000 },
                new Product { ID = "B003", Category = "Clothes", Price = 12000 },
                new Product { ID = "C001", Category = "Food", Price = 5000 },
                new Product { ID = "C002", Category = "Book", Price = 15000 },
                new Product { ID = "C003", Category = "Clothes", Price = 8000 },
                new Product { ID = "D001", Category = "Book", Price = 5000 },
            };
        return products;
    }
}
}
  • Program.cs
//Distint _ Product.cs포함
using Csharp;

List<Product> products = Product.GetProducts();
var ordering = (from p in products
                select p.Category).Distinct();

Console.WriteLine("카테고리별 이름 출력");
foreach (var item in ordering)
{
    Console.WriteLine($"<{item}>");
}

->

카테고리별 이름 출력
<Clothes>
<Book>
<Food>

그 외 LINQ 문법

순서관련 개념

  • Product 포함
  • Program.cs

using Csharp;

List<Product> products = Product.GetProducts();

Product product = (from p in products
                   where p.Category == "Food"
                   select p)
                     .First();

Console.WriteLine(product.ID);

->

A003

  • Program.cs
////Range 와 Repeat

//1 부터 100개를 가지고온다
var under100 = Enumerable.Range(1, 100).ToArray();

foreach (var item in under100)
{
    Console.Write(item + " ");
}
Console.WriteLine();

var rep_numbers = Enumerable.Repeat(5, 10);

foreach (var item in rep_numbers)
{
    Console.Write(item + " ");
}

->

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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
5 5 5 5 5 5 5 5 5 5

  • Program.cs
//Range 에 조건 추가하기
var oneTo100 = Enumerable.Range(1, 100);
var evenNum = from n in oneTo100
              where n % 2 == 0
              select n;

foreach (var item in evenNum)
{
    Console.Write(item + " ");
}
Console.WriteLine();

->

2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100

Join

  • Product.cs 포함
  • Program.cs
//상호 조인           
using ConsoleApp5;

string[] categories = {
                "Food",
     		    "Living",
                "Book",
                "Accessory"
            };

List<Product> products = Product.GetProducts();

var query = from c in categories
        join p in products on c equals p.Category
        select (Category: c, p.ID);

foreach (var item in query)
{
    Console.WriteLine(item.ID + " : " + item.Category);
}

->

A003 : Food
B002 : Food
C001 : Food
A002 : Book
C002 : Book
D001 : Book

파일처리

파일 입출력

  • 파일쓰기 (Program.cs)
string s = "Hello, alzio!";
File.WriteAllText("myFile.txt", s);

  • 파일읽기(Program.cs)
string s = File.ReadAllText("myFile.txt");
Console.WriteLine(s);

->

Hello, alzio!

StreamWriter/StreamReader

  • StreamWriter(Program.cs)
string path = "alzio.txt";

StreamWriter stream = new(path);
stream.WriteLine("Hello Alzio!");
stream.Write("12345");
stream.Write("67890");

stream.Close();

  • StreamReader(Program.cs)
string path = "alzio.txt";

StreamReader stream1 = new(path);
string line = stream1.ReadLine();
while(line != null)
{
    Console.WriteLine(line);
    line = stream1.ReadLine();
}

->

Hello Alzio!
1234567890

예외처리

alzio.txt가 아닌 alzio.txat로 없는 path를 설정하여 예외를 처리해보겠습니다!

  • Program.cs
string path = "alzio.txat";

try
{ 
    StreamReader stream1 = new(path);
    string line = stream1.ReadLine();
    while (line != null)
    {
        Console.WriteLine(line);
        line = stream1.ReadLine();
    }
}
catch (FileNotFoundException e)
{
    Console.WriteLine("path 예외발생 -> path 명을 확인해주세요.");
}
catch (Exception e)
{
    Console.WriteLine("기타 예외발생.");
}

->

path 예외발생 -> path 명을 확인해주세요.

한번에 읽어오기( ReadToEnd() );

string path = "alzio.txat";

StreamReader stream1 = new StreamReader(path);
string text = stream1.ReadToEnd();
Console.WriteLine(text);

배열로 다루기

string path = "fluit.txt";
string[] fruits = { "Apple", "Bananan", "Cherry" };

StreamWriter stream = new(path);
foreach (var item in fruits)
{
    stream.WriteLine(item);
}

for (int i = 0; i < 10; i++)
{
    stream.Write(i);
}

stream.Close();
Console.WriteLine(path + " 에 쓰기 완료.");

->


파일명 변경 및 복사

  • 파일명 변경(alzio.txt > alzioNew.txt)
string path = "alzio.txt";
File.Move(path, "alzioNew.txt");
  • 복사
File.Copy("alzioNew.txt", "alzioCopy.txt");
  • 절대경로로 만들기
string path = "C:\\alzio\\alzioNew.txt";
File.Copy("alzio.txt", path);

//alzio 폴더에 alzioNew.txt라는 이름으로 alzio.txt를 copy해라.
  • LINQ와 사용하기
string path = "fruits.txt";
var lines = File.ReadLines(path).Where(s=>s.Length > 2);

foreach (var item in lines)
{
    Console.WriteLine(item);
}

->

오레지
복숭아
코코넛
바나나
profile
하루하루 기록하기!
post-custom-banner

0개의 댓글