using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//Array가 제공해주는 Find() 메서드 이용하면서 최종(M4) 람다식 이용하는 방법
//M5(list);//쿼리 연산자 사용
namespace ConsoleEx
{
class Ex07_Lambda
{
static void Main(string[] args)
{
//Employee 배열
//Employee[] list = new Employee[5];
//list[0] = new Employee();// 이부분에서 실제 Employee 객체 생성
//int[] ns = new int[5] { 1, 2, 3, 4, 5 };
//위에 것을 아래부분에서 배열로 만들면서,
//동시에 실제 Employee 객체를 생성함. 단, 객체 초기화까지 병행하면서..
Employee[] list = new Employee[5] { new Employee { ID = "A001", Name = "홍길동", Age = 25 }, new Employee { ID = "A002", Name = "아무게", Age = 25 }, new Employee { ID = "A003", Name = "하하하", Age = 25 }, new Employee { ID = "A004", Name = "호호호", Age = 25 }, new Employee { ID = "A005", Name = "테스트", Age = 25 } };
//요구사항] list에서 ID가 "A003" 검색 => 이름?
// LINQ의 구성
// 1. 확장 메서드(쿼리 연산자) + 람다식 : C#표현에 가까움
// 2. 쿼리표현식 : SQL표현식과 유사
// M1(list);//가장 전형적인 방법 = for/foreach 사용
// M2(list);//Array가 제공하는 메서드(Find)
// M3(list);//Array가 제공하는 메서드사용(익명메서드)
// M4(list);//Array가 제공하는 메서드사용(람다식이용)
// M5(list);//쿼리 연산중에서 (.Where) 사용
M6(list);//쿼리 표현식
}
private static void M6(Employee[] list)
{
//select top 1 * from list where id = "A003"; 와 비슷한 표현방식으로 아래와같이 가능
Employee result = (from e in list where e.ID == "A003" select e).First();
Console.WriteLine(result.Name);
}
private static void M5(Employee[] list)
{
//쿼리 연산자 : SQL문과 유사하게 이름을 지어놓은 확장메서드
//객체 메서드 .Where, .Find(정적메서드)
Employee result = list.Where(e => e.ID == "A003").First();
Console.WriteLine(result.Name);
}
private static void M4(Employee[] list)
{
//M3()의 버전업
// 익명메서드 -> 람다식으로 변환 가능
// 단, 람다식이라도 델리게이트 선언과 필요할경우 원본 메서드는 미리 구현 해놔야 함
Employee result = Array.Find(list, e => e.ID == "A003");
Console.WriteLine(result.Name);
}
private static void M3(Employee[] list)
{
//M2()의 버전업; Find메서드의 인자에 익명 메서드 이용(다른곳에서 사용 안하고 여기서만 사용할테니까..)
Employee result = Array.Find(list, delegate(Employee e) { return e.ID == "A003"; });
Console.WriteLine(result.Name);
}
//Array 제네릭 메서드 이용
private static void M2(Employee[] list)
{
//Array 제네릭 메서드 이용
//.Find(배열명, 미리 구현해놓은 메서드이름)
//<> 생략가능
//Predicate(형식, 약속..) -> 메서드 생성
//배열 list에서 FindPredicate를 인자로 넘기면서 일치하는것 찾으면 True되는 동시에, 종료되고,
// 그 해당 Employee 객체를 rusult에 리턴해줌.
Employee result = Array.Find(list, FindPredicate);
Console.WriteLine(result.Name);
}
//위에서 Predicate로 사용할 메서드 선언
public static bool FindPredicate(Employee e)
{
return e.ID == "A003";
}
private static void M1(Employee[] list)
{
for (int i = 0; i < list.Length; i++)
{
if (list[i].ID == "A003")
{
Console.WriteLine(list[i].Name);
return;
}
}
}
}
//직원 클래스
class Employee
{
public string ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//람다식 사용을 위해서 미리 만들어 놓은 델리게이트..
// - Func 델리게이트(제네릭) 이용 하는법
namespace ConsoleEx
{
class Ex08_Func
{
static void Main(string[] args)
{
//요구사항] 정수값 입력 -> 제곱근 반환
//1. 람다식 -> 반드시 델리게이트 필요( 인자값 => 메서드본문)
// : 람다식 -> 익명 메서드 -> 메서드 저장 -> 델리게이트 필요
Mydelegate md1 = e => e * e; //하단에 델리게이트 선언 되어 있다.
Console.WriteLine(md1(5));
//요구사항] 정수값 입력 -> 실수값 * 2.5 반환
//람다식 사용을 위해서 미리 만들어 놓은 델리게이트..
// - Func 델리게이트(제네릭)
//<넘겨주는 자료형, 넘겨받는 자료형)
Func<double, double> md2 = e => e * 2.5;
Console.WriteLine(md2(2.1));
}
}
//델리게이트 선언을 이렇게 밑에다가 작성해도 됨.
public delegate int Mydelegate(int n);
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleEx
{
//반환값이 없는 델리게이트
public delegate void MyDelegate(string name);
class Ex09_Action
{
static void Main(string[] args)
{
//요구사항] 호출하면 인사하기!!
MyDelegate md1 = name => Console.WriteLine("안녕하세요 {0}", name);
md1("홍길동");
//Func : 매개변수O + 반환값O -> 대리호출 델리게이트
//Action : 매개변수O -반환값 X -델리게이트
//<넘겨주는자료형>
Action<int> md2 = n => Console.WriteLine(n * 2);
md2(10);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ex01
{
class Ex11_OrderBy
{
static void Main(string[] args)
{
Student[] list2 = new Student[3];
list2[0] = new Student { Name = "홍길동", Age = 20, Kor = 100 };
list2[1] = new Student { Name = "이훈", Age = 25, Kor = 90 };
list2[2] = new Student { Name = "남궁옥분", Age = 30, Kor = 80 };
//다음의 item = Student의 인자
//order by Name
//var result = list2.OrderBy(item => item.Age);
//foreach (var item in result)
//{
// Console.WriteLine(item.Name);
//}
//나이순으로 정렬한것을 이름으로 리턴 ******
//아래의 첫번째ㅑ orderby만 한 결과는 Student[]이 리턴되고 그 다음에 셀렉트에서 네임으로 필터링
var result = list2.OrderBy(item => item.Age).Select(item => item.Name);
foreach (var items in result)
{
Console.WriteLine(items);
}
Console.WriteLine();
//아래에서는 이미 앞부분에서 스트링(이름)만을 먼저 가져왔기때문에
//뒤의 Orderby에서 .Name가 없다.. 왜냐하면 item 자체가 Name이기 때문에 ***
//list2.Select(item => item.Name).OrderBy(item => item); ****
//order by len(name)
var result2 = list2.Select(item => item.Name).OrderBy(item => item.Length);
foreach (var item in result2)
{
Console.WriteLine(item);
}
}
}
class Student
{
public string Name { get; set; }
public int Age { get; set; }
public int Kor { get; set; }
public int Eng { get; set; }
public int Math { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ex01
{
class Ex12_Single
{
static void Main(string[] args)
{
//Select() : 전체 항목 반환
//Single() : 단일 항목 반환
List<string> list1 = new List<string>();
list1.Add("가가가");
list1.Add("나나나");
list1.Add("다다다");
Student[] list2 = new Student[3];
list2[0] = new Student { Name = "홍길동", Age = 20, Kor = 100 };
list2[1] = new Student { Name = "이훈", Age = 25, Kor = 90 };
list2[2] = new Student { Name = "남궁옥분", Age = 30, Kor = 80 };
//string 컬렉션 (result1 = list1)
var result1 = list1.Select(item => item.Substring(0, 1));
foreach (var item in result1)
{
Console.WriteLine(result1);
}
//Single
var result2 = list1.Single(item => item == "나나나");
Console.WriteLine(result2);
//result3은 Student를 리턴받음
var result3 = list2.Single(item => item.Name == "홍길동");
Console.WriteLine(result3.Name);
//.First() - 처음에 있는 한놈만 반환, 단 반환 형식은 Student형
var result4 = list2.Select(item => item.Name == "홍길동").First();
}
}
class Student
{
public string Name { get; set; }
public int Age { get; set; }
public int Kor { get; set; }
public int Eng { get; set; }
public int Math { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ex01
{
class Ex13_Where
{
static void Main(string[] args)
{
List<string> list1 = new List<string>();
list1.Add("이순신");
list1.Add("이문세");
list1.Add("홍길동");
var result1 = list1.Select(item => item.Substring(0, 1));//"성"의 집합
foreach (var item in result1)
{
Console.WriteLine("result1:{0}",item);
}
Console.WriteLine();
var result2 = list1.Where(item => item.Substring(0, 1) == "이").Select(item => item.Substring(1, 2)).OrderByDescending(item => item);
foreach (var item in result2)
{
Console.WriteLine("result2:{0}", item);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ex01
{
class Ex14_QueryExpression
{
static void Main(string[] args)
{
//LINQ
// 1. 쿼리연산자(내부적으로 람다식)
// - Select(item = item.Name)
// 2. 쿼리 표현식
Student[] list2 = new Student[3];
list2[0] = new Student { Name = "홍길동", Age = 20, Kor = 100 };
list2[1] = new Student { Name = "이훈", Age = 25, Kor = 90 };
list2[2] = new Student { Name = "남궁옥분", Age = 30, Kor = 80 };
//var result1 = list2.Select(n => n).Where(n => n.Age > 10).OrderBy(n => n.Age);
//쿼리 연산자와 비슷하다.
var result1 = from item in list2
where item.Age >= 25
orderby item.Age ascending//or decending
select item.Name;
//item.Name 컬렉션
foreach (var item in result1)
{
Console.WriteLine(item);
}
//1개이상 select 하고싶다면 익명 객체
var result2 = from item in list2
where item.Age >= 25
orderby item.Age ascending//or decending
select new { Name = item.Name, Age = item.Age };
foreach (var item in result2)
{
Console.WriteLine(item.Name + " : " + item.Age);
}
}
}
class Student
{
public string Name { get; set; }
public int Age { get; set; }
public int Kor { get; set; }
public int Eng { get; set; }
public int Math { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ex01
{
class Ex15_DB
{
static void Main(string[] args)
{
pubsDataContext pubs = new pubsDataContext();
//M1(pubs);
//M2(pubs);
M3(pubs);
}
private static void M3(pubsDataContext pubs)
{
//Where, Order By
var list = pubs.titles.Where(item => item.price >= 15).OrderBy(item => item.title).Select(item => item.title);
foreach (var item in list)
{
Console.WriteLine(item);
}
}
private static void M2(pubsDataContext pubs)
{
//책제목, 책가격, 출간일
var list = pubs.titles.Select(row => row);
foreach (var item in list)
{
Console.WriteLine("{0} - {1} - {2}", item.title, item.price, item.pubdate);
}
}
private static void M1(pubsDataContext pubs)
{
//pubs.titles에서 도서제목을 출력
//테이블은 행의 집합 항목을 하나 갖고오는건 레코드를 하나 가져오겠 다는것.
//db에 있는 모든 것들이 프로퍼티로 제공 된다.
//생산성이 굉장히 높다.
var list = pubs.titles.Select(row => row.title);
foreach (var title in list)
{
Console.WriteLine(title);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ex01
{
class Ex16_DB
{
static void Main(string[] args)
{
pubsMethodDataContext adonet = new pubsMethodDataContext();
//데이터 입력
//adonet.upMemoInsert("메모입니다.", "홍길동");
//adonet.upMemoInsert("메모입니다.2", "아무게");
//adonet.upMemoInsert("메모입니다.3", "테스트");
//수정
//adonet.upMemoUpdate("수정", "수정", 1);
//삭제
//adonet.upMemoDelete(1);
//전체보기
var result = adonet.upMemoSelect();
foreach (var item in result)
{
Console.WriteLine(item.memo);
}
//
var result2 = adonet.upMemoSearch("2");
foreach (var item in result2)
{
Console.WriteLine(item.memo);
}
}
}
}
TABLE
use ADONET;
--메모장
CREATE TABLE tblMemo
(
seq int identity(1,1) not null primary key,
memo varchar(1000) not null,
name nvarchar(10) not null,
regDate datetime default(getdate()) not null
)
--LINQ 제어-> 프로시저미리생성
--입력
CREATE proc upMemoInsert
@memo varchar(1000),
@name nvarchar(10)
AS
INSERT INTO tblMemo (memo, name) VALUES(@memo, @name);
--수정
CREATE PROC upMemoUpdate
@memo varchar(1000),
@name nvarchar(10),
@seq int
AS
UPDATE tblMemo SET memo = @memo, name = @name WHERE seq = @seq;
--삭제
CREATE PROC upMemoDelete
@memo varchar(1000),
@name nvarchar(10),
@seq int
AS
DELETE FROM tblMemo WHERE seq = @seq;
--출력
CREATE proc upMemoSelect
AS
SELECT * FROM tblMemo;
-- 검색
CREATE proc upMemoSearch
@search varchar(100)
AS
SELECT * FROM tblMemo WHERE memo like '%' + @search + '%';
SELECT * FROM tblMemo