본문 바로가기

Programming/C#18

[C#] 반복문에서 삼항연산자 vs Func 뭐가 좋을까? 업무를 하다가 문득 이런 생각이 들었다. '다음과 같은 반복문 안에서 _condition은 항상 true 또는 false인데 매번 for문 안에서 체크하는 것이 비효율적인 것 같다.' for (var i = 0; i input * 2 : input => input; for (var i = 0; i < repeat; i++) { va.. 2024. 3. 8.
[C#] Linq SingleOrDefault() vs FirstOrDefault() Linq를 사용하다 보면 자주 쓰는 SingleOrDefault와 FirstOrDefault. 둘의 차이점이 뭘까? 테스트를 위한 코드를 준비한다. string?[] empty = []; string?[] oneElement = ["a"]; string?[] twoElements = ["a", "b"]; var firstEmpty = empty.FirstOrDefault(); var singleEmpty = empty.SingleOrDefault(); var firstOneElement = oneElement.FirstOrDefault(); var singleOneElement = oneElement.SingleOrDefault(); var firstTwoElement = twoElements.First.. 2024. 2. 17.
[C#] BsonDocument를 JSON으로 변환하기 MongoDB를 사용하면 BsonDocument와 친해지게 된다. 서버와 클라이언트의 통신에는 JSON 형태로 하는 경우가 많아서 JSON으로 변환이 필요한 상황이 있다. ToJson() BsonExtensionMethods를 이용하면 JSON string으로 변환할 수 있다. var actual = collection.Find(c => c.Id == targetId).FirstOrDefault(); var json = actual.ToJson(); 그런데 다음과 같이 ObjectId(), NumberDecimal(), IsoDate() 같은 값들이 표시된다. 그리고 이것은 JSON parsing error를 발생시킬 수 있다. { "_id": ObjectId("507f1f77bcf86cd79943901.. 2024. 2. 9.
[C#] Closure 문제 아래 코드는 어떤 결과가 출력될까? 정답은 "10"이 10번 출력된다. 클로저(Closure) Lexical scope 내의 변수를 사용하는 일급 함수를 말한다. Lexical scope 변수가 참조될 수 있는 영역. 일급 함수(first-class functions) 함수가 다른 변수를 다루는 것처럼 취급할 수 있을 때 그 언어는 일급 함수를 갖는다고 한다. C#에서 anonymous method, lambda expression로 일급 함수를 지원한다. 다시 예시로 돌아가자. List list = new(); for (int i = 0; i Debug.WriteLine($"{i}")); } list.ForEach(action => action()); .. 2022. 10. 21.
[C#] Any() vs Count() 성능 비교 50,000 records 테스트 결과 Any(), Count() 모두 Condition 없이 사용했을 때 빠르고 Condition을 사용하는 경우 Any()가 성능이 훨씬 좋았다. 하지만, Count property를 사용하는 경우가 가장 빠르다. Count() method는 모든 element들을 iteration 해야 하기 때문에 O(n)이다. 반면에 Count property는 _size private 변수를 직접 사용하므로 O(1)이다. 결론: Count property를 사용할 수 있으면 사용하고, 그렇지 않으면 Any()를 사용하자. https://code-maze.com/any-vs-count-dotnet/ 2022. 10. 12.
[C#] Linq로 INNER JOIN하기 SQL에서 두 테이블을 JOIN 해서 가져오기도 하지만 C#에서 각가의 두 테이블을 Linq를 활용해서 JOIN 할 수 있다. List tableA = new List(); List tableB = new List(); var join1 = tableA.Join( tableB, a => a.Code, b => b.Code, (a, b) => new { b.ColumnB, a.ColumnA }); var join2 = from a in tableA join b in tableB on a.Code equals b.Code select new { b.ColumnB, a.ColumnA }; 위 두 가지 방식으로 사용할 수 있는데 join1은 Linq query syntax, join2는 Linq method c.. 2022. 8. 24.
C# Linq 시각화 C# Linq 시각화해서 설명한 좋은 아티클 Zip(), Intersect() 같은 아직 생소한 Method도 있었네. https://steven-giesel.com/blogPost/d65c5411-a69b-489f-b73f-18ce0ed8678d LINQ explained with sketches Often times it is easier to have a nice illustration at hand, which explains you things the easy way. So let's do this for a lot of LINQ operations like Where, Select and friends. Of course a small explanation will be attached as .. 2022. 8. 10.
C# Class 내부 구성 요소의 순서 팀에서 Resharper와 StyleCop을 이용해서 코딩 컨벤션을 맞추고 있다. 컨벤션 규칙을 정하다가 C# Class 내부 구성 요소는 어떤 순서로 배치해야 하는지 궁금해졌다. StyleCop에서 정한 C# Class 구성요소의 순서는 다음과 같다. SA1201: Ordering Rules Fields Constructors Finalizers (Destructors) Delegates Events Enums Interfaces Properties Indexers Methods Structs Classes* 📝 For ordering purposes, C# 9 records are treated as classes. Constructor 다음에 Property가 있어야 하는 것은 그동안 모르고 있었다. 2022. 6. 22.
C# string Contains() Linq나 문자열에서 원하는 문자열을 찾을 때 사용하는 Contains() 영어의 경우 대소문자 구분이 있다. String.Contains()에서는 대소문자 구분이 불가능해서 String.IndexOf(String, StringComparison) overload를 사용하고는 했다. 하지만, .NET core 에서는 StringComparison 파라미터를 지원한다. https://docs.microsoft.com/en-us/dotnet/api/system.string.contains?view=net-6.0#system-string-contains(system-string-system-stringcomparison) string a = "abc"; string b = "C"; // False Consol.. 2022. 5. 3.