728x90
C#
AsEnumerable Method
- LINQ 쿼리는 IEnumerable<T> 또는 IQueryable 인터페이스를 구현하는 데이터 원본에서 작동한다. DataTable 클래스는 이 인터페이스를 구현하지 않기 때문에 직접 LINQ 쿼리를 사용할 수 없다.
- AsEnumerable 메서드를 사용하여 Datatable을 IEnumerable<T>로 변환할 수 있다. 변환된 객체는 원본 DataTable에 바인딩 된다. 따라서 AsEnumerable를 여러 번 호출해도 모두 같은 원본 DataTable에 바인딩된 독립적인 쿼리 가능한 객체를 반환한다.
- DataTable을 LINQ 쿼리의 원본으로 사용하려면 AsEnumerable 메서드를 사용하여 IEnumerable<T>로 변환해야 한다. 이렇게 변환된 객체는 원본 DataTable에 바인딩되며, 여러번 변환해도 각각 독립적인 쿼리를 수행할 수 있다.
LINQ(Language Integrated Query)
- C#과 같은 .NET 언어에서 데이터 소스에 대한 쿼리를 쉽게 작성하고 실행할 수 있도록 하는 기능이다. LINQ는 SQL 쿼리와 유사한 문법을 사용하여 컬렉션, XML, 데이터베이스, 객체, 그리고 기타 데이터 소스에 대해 쿼리를 작성할 수 있다.
- LINQ의 쿼리 식과 메서드 체이닝 문법을 통해 데이터를 필터링, 투영, 정렬, 그룹화, 조인, 집계 등의 다양한 연산을 수행할 수 있다. LINQ를 통해 코드의 가독성을 높이고 복잡한 데이터 처리 로직을 간결하게 작성할 수 있다.
LINQ의 주요 구성 요소
- LINQ to Object
- 메모리에 있는 객체 컬렉션(ex: 배열, 리스트)에 대해 쿼리를 수행할 수 있다.
- LINQ to SQL
- SQL Server 데이터베이스에 대해 쿼리를 수행할 수 있다.
- LINQ to XML
- XML 데이터에 대해 쿼리를 수행할 수 있다.
- LINQ TO Entities
- Entity Framework를 사용하여 데이터베이스에 대해 쿼리를 수행할 수 있다.
기본 문법
- LINQ 쿼리는 두 가지 문법 스타일을 지원한다.
- 쿼리 식(Query Syntax)
- SQL과 유사한 문법
- 메서드 체이닝(Method Syntax)
- 메서드 체이닝을 이용한 문법
Select, Where, OrderBy, List.Find(All)
- Select, Where, OrderBy 메서드들은 IEnumerable 인터페이스에서 제공하고 있다. 이 말은 IEnumerable을 상속하고 있는 모든 클래스에서 사용할 수 있음을 뜻한다.
- Find는 리스트이다.
- System.Collections에 있는 데이터 묶음 클래스가 있다. List, ArrayList, Dictionary, Stack, Queue등 거의 모든 Collections에서 사용이 가능하다.
- Func을 매개변수로 받을 수 있다.
- 함수로 그때 필요한 값을 찾아올 수 있다.
where
- 조건을 집어넣어 조건에 맞는 인스턴스 또는 값들을 가져온다.
Select
- Where과 달리 조건에 맞는 인스턴스가 아닌 그 값 자체를 가져온다.
Find
- 조건을 집어넣어 조건에 맞는 인스턴스 또는 값들을 가져온다.
- FindAll을 사용할 시 Where과 기능은 완전히 유사하지만 FindAll의 경우 반환 타입은 List<item>, where의 경우 IEnumerable<Item>이 된다.
OrderBy, OrderByDescending
- 매개변수로 넣은 멤버를 기준으로 값을 정렬한다.
참조
https://programming-mr.tistory.com/67
ConcurrentDictionary<TKey, TValue>
- 여러 개의 스레드에서 동시에 액세스 할 수 있는 키/값 쌍의 스레드로부터 안전한 컬렉션이다.
- 모든 작업은 원자성이며 클래스의 다른 모든 작업과 관련하여 스레드로부터 안전하다.
- ConcurrentDictionary<TKey, TValue> 유일한 예외는 대리자, 및 GetOrAdd를 허용하는 메서드이다. AddOrUpdate 사전에 대한 수정 및 쓰기 작업의 경우는 ConcurrentDictionary<TKey, TValue> 세분화된 잠금을 사용하여 스레드 안전을 보장한다.(사전에 대한 읽기 작업은 잠금이 ㅇ벗는 방식으로 수행된다.) 그러나 이러한 메서드에 대한 대리자는 잠금에서 알 수 없는 코드를 실행하여 발생할 수 있는 문제를 방지하기 위해 잠금 외부에서 호출된다. 따라서 이러한 대리자가 실행하는 코드에는 작업의 원자성이 적용되지 않는다.
스레드 보안
- ConcurrentDictionary<TKey, TValue> 모든 공용 및 보호된 멤버는 스레드로부터 안전하며 여러 스레드에서 동시에 사용할 수 있다. 그러나 확정 메서드를 포함하여 구현하는 인터페이스 ConcurrentDictionary<TKey, TValue> 중 하나를 통해 액세스하는 멤버는 스레드로부터 안전하게 보호되지 않으며 호출자가 동기화해야 할 수도 있다.
DebuggerNonUserCodeAttribute
- 디버거가 코드의 특정 부분을 사용자 코드가 아닌 것으로 처리하도록 지정하는 데 사용된다.
- 이 속성이 적용된 메서드, 속성 또는 클래스는 디버깅 세션에서 자동으로 무시된다.
- 주로 코드 생성 도구가 생성한 코드나 라이브러리 코드를 디버깅할 때 사용자에게 불필요한 디버깅 정보가 노출되는 것을 방지하는 데 사용된다.
효과
- 디버깅 세션 중에 이 메서드나 클래스에 대한 스택 추적이 생략된다.
- 예외가 발생하더라도 디버거는 이 코드의 내부로 들어가지 않고 사용자 코드로 이동한다.
- 디버거가 해당 코드의 중단점(breakpoint)을 무시한다.
GerneratedCodeAttribute
- 코드가 도구에 의해 생성되었음을 나타내는 속성이다. 이 속성은 코드 분석 도구와 같은 도구가 생성된 코드와 수동으로 작성된 코드를 구분하는 데 도움이 된다. 이 속성은 코드 생성기, 예를 들어 코드 생성 도구나 프록시 생성 도구 등이 생성한 코드에 주로 사용된다.
속성 구성
- Tool
- 코드를 생성한 도구의 이름
- Version
- 코드 생성 도구의 버전
효과
- 코드 분석 도구가 이 속성을 사용하여 경고 또는 오류를 무시할 수 있다.
- 코드를 유지 보수하는 개발자가 이 코드가 자동으로 생성된 것임을 명확히 알 수 있다.
RepeatedField
- Google Protocol Buffers(Protobuf)에서 사용되는 C# 클래스이다.
- Protocol Buffers는 데이터를 직렬화하는 방법으로, Google에서 개발했으며, 특히 네트워크 통신 및 데이터 저장소에 효율적인 데이터 포맷을 제공한다.
- RepeatedField는 프로토콜 버퍼 메시지 내에서 여러 값을 담을 수 있는 반복 필드를 나타낸다.
특징
- 반복 필드
- 프로토콜 버퍼 메시지에서 반복 필드는 여러 개의 동일한 타입의 값을 담을 수 있는 필드이다.
- 제네릭 클래스
- RepeatedField<T>는 제네릭 클래스이며, T는 저장될 값의 타입을 나타낸다.
- 자동으로 관리되는 컬렉션
- 기본적으로 List와 유사하게 동작하며, 요소를 추가, 제거 및 접근할 수 있는 다양한 메서드를 제공한다.
GUID(Globally Unique Identifier)
- 전 세계적으로 유일한 값을 생성하기 위한 표준으로, 주로 소프트웨어에서 고유한 식별자를 생성하는 데 사용된다.
- Microsoft에서 처음 도입됐으며, 다른 시스템에서는 UUID(Universally Unique Identifier)로도 알려져 있다.
- 128비트의 숫자이며, 일반적으로 32자리 16진수로 표현된다.
형식
- 32자리 16진수로 표현되며, 하이픈(’-’)으로 구분된 5개의 그룹으로 나뉜다.
ex)
123e4567-e89b-12d3-a456-426614174000
- 이 형식은 다음과 같이 구분된다.
- 첫 번째 그룹 : 8자리
- 두 번째 그룹 : 4자리
- 세 번째 그룹 : 4자리
- 네 번째 그룹 : 4자리
- 다섯 번째 그룹 : 12자리
사용 예
- 데이터베이스의 기본 키, 소프트웨어의 라이선스 키, 파일 및 리소스의 고유 식별자, 분산 시스템에서의 고유 식별자 등.
특성
- 고유성
- 전 세계적으로 유일한 값으로 설계되어 중복될 가능성이 매우 낮습니다.
- 128비트 길이
- 128비트 길이의 숫자로, 다양한 환경에서 고유 식별자로 사용될 수 있다.
- 무작위성
- 무작위로 생성되며, 특정 패턴을 따르지 않는다.
Task.FromResult
- C#에서 비동기 프로그래밍을 할 때 사용되는 유용한 메서드이다.
- 이미 알고 있는 결과 값으로 완료된 TASK<TResult>를 생성한다.
- 동기 작업을 비동기 메서드의 결과로 반환해야 할 때 유용하다.
특징
- 이미 완료된 상태의 Task를 반환한다.
- CPU 작업이나 I/O 작업을 기다리지 않는다.
- 스레드 풀을 사용하지 않는다.
사용 예
- 캐시된 결과를 반환할 때
- 단위 테스트에서 모의 객체(mock)를 만들 때
- 비동기 인터페이스를 구현하지만 실제로는 동기 작업을 수행할 때
성능
- 새로운 Task 객체를 생성하는 것보다 효율적이다.
- 이미 알고 있는 값으로 Task를 생성할 때 최적화된 방법이다.
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.07.30 C#, 배치 파일과 도스 명령어, 게임 서버 (1) | 2024.07.30 |
---|---|
24.07.29 C#, 게임 서버 (0) | 2024.07.29 |
24.07.25 C# (0) | 2024.07.25 |
24.07.24 C# (1) | 2024.07.24 |
24.07.23 RedMine (0) | 2024.07.23 |