LINQ 및 Lambda Expressions를 사용하면 코드를 덜 읽을 수 있습니까? [닫은]


43

Linq의 동료와 토론 중입니다. 여기에서 복사하겠습니다.

동료 : 여기에서 솔직 해집니다. Linq 구문이 짜증납니다. 혼란스럽고 직관적이지 않습니다.

나 : 오, T-SQL보다 더 혼란스러워?

동료 : 예.

나 : 그것은 같은 기본 부분을 가지고 있으며, 선택, 어디서, 그리고

동료 : Linq는 나에게 관계형 + OO의 개자식입니다. 공동 작업자 : 잘못 이해하지 마십시오. 엄청나게 강력하지만 SQL을 다시 사용하여 개체 컬렉션을 다시 사용했습니다.

Linq + Lamda를 사용하는 것이 매우 강력하고 (동의 함) 코드를 읽기 쉽게 만듭니다 (그 시점에 동의하지 않음).

pickFiles = from f in pickFolder.GetFiles("*.txt")
where ValidAuditFileName.IsMatch(f.Name)
select f;

또는

var existing = from s in ActiveRecordLinq.AsQueryable<ScannedEntity>()
where s.FileName == f.FullName && s.DocumentType != "Unknown"
select s;

또는 (여기서 VB 코드)

   Dim notVerified = From image In images.AsParallel
     Group Join verifyFile In verifyFolder.GetFiles("*.vfy").AsParallel.Where(
      Function(v) v.Length > 0
      ).AsParallel
   On image.Name.Replace(image.Extension, ".vfy") Equals verifyFile.Name
     Into verifyList = Group
    From verify In verifyList.DefaultIfEmpty
    Where verify Is Nothing
    Select verify

나에게 이것은 깨끗하고 쉽고 (적어도 대안보다 쉽다), 그것에 대한 당신의 의견은 무엇입니까?


11
인간은 일반적으로 변화를 싫어합니다. 많은 사람들이 그것을 너무 싫어해서 실제로 두려워합니다.
Tony

9
linq는 C # 및 VB.Net에 추가 된 기능적인 프로그래밍 구문입니다. linq와 lambda 표현은 기본적으로 "FP sucks"라고 말합니다. 그것이 동료의 말입니다. 나는 토론이 다른 곳에서 해쉬되었다고 생각한다.
Scott Whitlock

48
사람들이 실제로 "친숙한"을 의미 할 때 "직관적 인"이라는 단어를 사용하는 경향이 있다는 것은 다른 사람을 괴롭히는가?
Larry Coleman

7
어쨌든 C # 팀 (Eric Lippert 포함)은 Linq가 SQL을 포팅하는 것이 아니라고 설명했습니다 . 나는 당신의 동료가 Luddite라고 말할 것입니다.
Aaronaught

16
그만한 가치가 있습니다 : 부인 (사무실 관리자-실제 프로그래밍 경험이 없음)은 aaronaught의 3 가지 예를 보았고 linq 및 lambda 예의 의도를 전통적인 명령 예보다 훨씬 쉽게 해독 할 수있었습니다 .
Steven Evers

답변:


73

더 이상 올바른 게시물을 찾을 수 없지만 Eric Lippert (및 다른 여러 소프트웨어)가 Linq의 선언 방식에 대해 여러 차례 의견을 제시했습니다 . 이는 몇 가지 문제 클래스에서 명령 구문 보다 훨씬 직관적 입니다.

Linq를 사용하면 메커니즘이 아니라 의도 를 표현하는 코드를 작성할 수 있습니다 .

어느 것이 더 읽기 쉬운 지 말해주십시오. 이:

IEnumerable<Customer> GetVipCustomers(IEnumerable<Customer> source)
{
    List<Customer> results = new List<Customer>();
    foreach (Customer c in source)
    {
        if (c.FirstName == "Aaron")
        {
            results.Add(c);
        }
    }
    results.Sort(new LastNameComparer());
    return results;
}

class LastNameComparer : IComparer<Customer>
{
    public int Compare(Customer a, Customer b)
    {
        return x.LastName.CompareTo(b.LastName);
    }
}

아니면 이거?

IEnumerable<Customer> GetVipCustomers(IEnumerable<Customer> source)
{
    return from c in source
           where c.FirstName == "Aaron"
           orderby c.LastName
           select c;
}

아니면 이것도?

IEnumerable<Customer> GetVipCustomers(IEnumerable<Customer> source)
{
    return source.Where(c => c.FirstName == "Aaron").OrderBy(c => c.LastName);
}

첫 번째 예는 가장 간단한 결과를 얻기 위해 무의미한 상용구입니다. Linq 버전보다 읽기 쉽다고 생각하는 사람은 머리를 검사해야합니다. 뿐만 아니라 첫 번째 메모리는 메모리를 낭비합니다. yield return정렬 때문에 사용하여 작성할 수도 없습니다 .

동료가 원하는 것을 말할 수 있습니다. 개인적으로, 나는 Linq에 개선 것 같아요 무척 코드의 가독성을.

Linq에 대한 "관계"는 없습니다. SQL과 표면적 인 유사성이 있지만 관계형 미적분을 구현하기 위해 어떤 모양이나 형태로도 시도하지는 않습니다. 시퀀스를보다 쉽게 ​​쿼리하고 프로젝트 할 수있게 해주는 확장 기능입니다. "쿼리"는 "관계형"을 의미하지 않으며 실제로 SQL과 같은 구문을 사용하는 비 관계형 데이터베이스가 여러 개 있습니다. Linq는 순전히 객체 지향적이며 C # 팀의 일부 표현 트리 부두 및 영리한 디자인으로 인해 Linq to SQL과 같은 프레임 워크를 통해 관계형 데이터베이스와 함께 작동하여 익명 함수를 암시 적으로 표현 트리로 변환 할 수 있습니다.


6
+1 LINQ가 마음에 들지 않으면 아마 "당신이 옳은 일을하지 않기"때문일 것입니다 :)
Darknight

1
Linq is purely object-oriented이것을 위해 +1. 이것이 팀 스타일 가이드가 쿼리 구문에 유창한 구문을 사용하도록하는 이유이기도합니다. 나는 C와 같은 언어로 된 객체 표기법에 익숙한 누군가에게 링크의 OO 특성을 더 분명하게 만듭니다.
SBI

1
게시물이 7 살이라는 것을 알고 있습니다. Linq를 만나기 전에 기능 언어를 주요 도구로 사용 했습니까?
Sergey.quixoticaxis.Ivanov

4
솔직히 말해서 foor 루프를 선호합니다. 왜냐하면 NULL 참조 예외가있을 수 있고 어디서 null을 처리하는지, 그리고 디버깅을 어렵게 만드는 실행을 지연시키지 않고 n 개의 목록을 만들지 않기 때문에 즉시 볼 수 있기 때문입니다. 또한 for-loop가 더 효율적입니다.
Quandary

1
@Aaronaught, 정렬을 제거하고 절차 코드를 Horstmann 스타일로 다시 포맷 하면 LINQ 버전 보다 읽기 쉽습니다 . 그리고 단일 책임의 원칙에 따라 분류는 실제로 GetVipCustomers()이름에없는 것처럼 VIP 고객 모음 만 임의의 순서로 반환해야합니다. 를 들어 희귀 순서가 중요 경우, 같은 화면에 출력으로 정렬 발신자 수집을 할 수 있습니다.
Ant_222

69

동료 : 여기에서 솔직 해집니다. Linq 구문이 짜증납니다. 혼란스럽고 직관적이지 않습니다.

그 비판에 대해서는 논쟁 할 수 없습니다. 동료에게는 짜증나게 합니다. 명확하고 직관적 인 구문을 설계하지 못했습니다. 그것은 우리의 실패이며, 당신은 당신의 동료에게 사과를 전할 수 있습니다. 더 나은 방법을 제안합니다. 동료가 구체적으로 혼란 스럽거나 직관적이지 않은 것은 무엇입니까?

그러나 모든 사람을 기쁘게 할 수는 없습니다. 내 개인적인 의견과 내가 그 주제에 관해 이야기 한 대부분의 사람들의 의견은 쿼리 이해 구문이 동등한 명령 구문보다 훨씬 명확하다는 것입니다. 분명히 모든 사람이 동의하는 것은 아니지만, 운 좋게도 언어 디자인을 할 때 수백만 명의 고객에 대한 합의가 필요하지 않습니다.

"직관적 인"이라는 주제에 대해, 저는 많은 다른 언어를 공부 한 영어 언어학 자의 이야기를 떠올리게되었으며, 영어에서는 단어가 당신과 같은 순서로 오기 때문에 영어 가 모든 언어 중 최고라고 결론을 내 렸습니다 그들을 생각하십시오 . 프랑스 인과 달리 그들은 "개 흰자위가 고기를 붉게 먹는다"와 같은 것을 끊임없이 말합니다. 프랑스 사람들 이 단어를 올바른 순서 로 생각한 다음 프랑스어 순서 로 말해야 하는 것은 얼마나 어려운 일입니까 ! 프랑스어는 너무 직관적이지 않습니다! 프랑스 인이 그것을 말할 수 있다는 것은 놀라운 일입니다. 그리고 독일인? 그들은 "개가 고기를 먹는다"라고 생각하지만 "고기가 먹는 개"라고 말해야한다!?!

종종 "직관적 인"것은 친숙한 문제 일뿐입니다. "select"절로 쿼리 시작을 중지하기 전에 LINQ 작업에 몇 달 이 걸렸습니다 . 이제는 두 번째 특성이며 SQL 순서는 기괴한 것 같습니다.

그렇습니다! 범위 지정 규칙은 모두 SQL에서 엉망입니다. 동료에게 지적하고 싶은 것은 LINQ가 (1) 변수 및 범위의 도입이 왼쪽에서 오른쪽으로 발생하고 (*), (2) 쿼리가 페이지에 나타나는 순서는 실행 순서 즉, 말할 때

from c in customers where c.City == "London" select c.Name

c는 왼쪽에 스코프에 표시되고 오른쪽을 통해 스코프에 유지됩니다. 그리고 발생하는 순서는 다음과 같습니다. 먼저 "고객"이 평가됩니다. 그런 다음 "where"를 평가하여 시퀀스를 필터링합니다. 그런 다음 필터링 된 시퀀스는 "select"에 의해 투영됩니다.

SQL에는이 속성이 없습니다. 당신이 말하는 경우

SELECT Name FROM Customers WHERE City = 'London'

그런 다음 "이름"은 왼쪽이 아닌 오른쪽에 의해 범위에 들어가고 쿼리는 완전히 엉망인 순서로 실행됩니다. 중간 절이 먼저 평가되고 마지막 절이 평가되고 첫 번째 절이 평가됩니다. 지금은 오랫동안 LINQ와 함께 일한 적이있어 미쳤고 직관적이지 않은 것 같습니다.


(*) 범위 지정 규칙은 LINQ에서 join 절을 사용하면 약간 이상합니다. 그러나 그 외에는 범위가 멋지게 중첩됩니다.


5
Nitpick :에서 독일어, 실제로 영어와 같은 순서이다 "데르 개자리가 FLEISCH이 DAS를 frisst", "개를 먹는 고기": 그 외에, 내가 LINQ 쿼리가 매우 읽을 수있는 구문 발견 나는 그것이 SQL 아니었다 실현 한 번 .
Michael Stum

18
@ gbjbaanb : 나는 LINQ 구문이 주관적으로 전적으로 주관적으로 정당화되는 것이 아닙니다 . 그보다는 LINQ 구문이 툴링을 염두에두고 설계 되었기 때문에 LINQ 구문을 작성하는 데 도움이되는 툴을 설계하는 것이 훨씬 쉬우 며 정신적으로 이해하기가 쉽다는 것을 전적으로 객관적으로 근거로하고 있습니다. 어휘와 같은 순서로 발생하기 때문에 쿼리에서 이벤트가 발생하는 순서.
Eric Lippert

2
Eric, 선언적 스타일의 프로그래밍 관점에서 Linq가 SQL보다 적합하다는 것을 이해합니다. 그러나 SQL보다 사람이 읽을 수 있습니까? 안 돼 '개가 붉은 고기를 먹는다'가 어렵다면 '붉은 색의 부엌에서 칼을 얻는 것이 얼마나 쉬운가?' 사실 우리 모두는 '부엌에서 탁자 위에있는 칼을 얻는다'고 말하고 생각합니다. 그리고 그것이 SQL이 LINQ보다 실생활에 더 가까운 곳입니다.
nawfal

6
가게가 자정까지 영업하는 스타 벅스 커피 한 잔을 원합니다. 익숙한 것 같습니까? SQL 쿼리와 정확히 같은 순서입니다. 예, LINQ는 표준 SQL 쿼리를 실행하기 위해 생성해야하는 불필요한 코드보다 더 읽기 쉽습니다. 그러나 LINQ는 SQL 쿼리 자체보다 읽기 쉽습니다. 그렇습니다. LINQ 개발자는 왼쪽에서 오른쪽으로 범위를 정하는 것이 유리할 수 있지만 사용자는 왜 관심을 가져야합니까? 나는 유용성에만 관심이 있습니다.
KyleM

8
@KyleM : 물론입니다. 유용성은 LINQ 디자인에서 매우 중요한 측면이었습니다. 특히 생산성 도구를 사용하는 것이 중요했습니다. 범위 지정은 LINQ 쿼리에서 왼쪽에서 쓰기로 흐르기 때문에 입력 할 c.때 IDE는 이미 유형을 알고 cIntelliSense를 제공 ​​할 수 있습니다. LINQ에서는 "c가있는 고객의 c"라고 말합니다. 붐의 멤버를 나열하여 IntelliSense를 도와드립니다 Customer. SQL에서 "SELECT name FROM customers"를 입력하면 name 이전에 입력 했으므로 "name"이 좋은 선택임을 알려주는 IDE 도움말을 얻을 수 없습니다 customers.
Eric Lippert

22

프로그래밍 세계의 다른 것들과 마찬가지로 구문에 익숙해지면 (잠재적으로) 읽기가 더 쉽습니다.

프로그래밍 세계의 다른 것들과 마찬가지로 스파게티 코드 또는 기타 남용의 가능성이 있습니다.

프로그래밍 세계의 다른 어떤 것과 마찬가지로, 이런 식으로 또는 다른 방법으로 할 수 있습니다.

프로그래밍 세계의 다른 것과 마찬가지로 마일리지가 다를 수 있습니다.


6

LINQ / 람다와 관련하여 "컴퓨터에서 읽을 수있는 것이 아니라 사람이 읽을 수있는 코드를 작성하십시오"라는 내용의 주석 / 발언을 보았습니다.

이 문장에는 많은 장점이 있다고 생각하지만, 어셈블리, 절차, OO, 관리, 고 처리량 작업 병렬 솔루션을 통해 개발 언어의 전체 영역을 거친 개발자 (예 : 나 자신)를 고려하십시오. .

나는 코드를 가능한 한 읽기 쉽고 재사용 가능하게 만들고 다양한 GOF 디자인 패턴 원칙을 채택하여 다양한 이기종 사업 부문에 걸쳐 생산 품질 시스템과 서비스를 제공하는 데 자부심을 느꼈습니다.

내가 람다 표현을 처음 만났을 때 나는 생각했다 : "그게 대체 뭐야?!" 그것은 친숙하고 (따라서 편한) 명시 적 선언 구문에 반 직관적이었습니다 . 그러나 구직자에있는 더 젊은 <5yrs는 그러나 그것이 하늘에서 만나였던 것처럼 그것을 때렸다!

컴퓨터처럼 (구문 적 의미에서) 생각하는 것은 언어와 상관없이 직접 코딩 구문으로 매우 쉽게 번역되기 때문입니다. 20 + yr (제 경우 30 +)에 대한 계산적 사고 방식을 가졌을 때 람다 식 의 초기 구문 충격 이 쉽게 두려움과 불신으로 이어질 수 있음을 알아야합니다 .

OP의 동료는 나 자신과 비슷한 배경에서 온 것일 수도 있고 (즉, 몇 번이나 블록 주위에 있었을 수도 있음) 당시에는 반 직관적 이었을까요? 내 질문은 : 당신은 그것에 대해 무엇을 했습니까? 인라인 구문의 이점을 이해하도록 동료를 다시 교육 시키려고 했습니까? 아니면 "프로그램과 함께 있지 않음"으로 인해 필적 / 비방 한 적이 있습니까? 전자는 아마도 당신의 동료가 당신의 생각의 선으로 돌아 오는 것을 보았을 것입니다. 후자는 아마도 LINQ / 람다 구문을 더욱 불신하게 만들 것이고 따라서 부정적인 의견을 악화시킬 것입니다.

나 자신을 위해서 나는 내 자신의 사고 방식을 다시 교육해야했다. (에릭이 암시 한 것처럼, 그것은 의미있는 변화가 아니며, 80 년대 미란다에서 프로그래밍해야했기 때문에 함수형 프로그래밍 경험을 공유했다) 그러나 일단 그 고통을 겪고 나면 그 이점은 명백하지만 더 중요하게는 사용법이 과도하게 사용 된 곳 (즉, 그것을 사용하기 위해 사용 된 곳), 복잡하고 반복적 인 경우 (그러한 경우 DRY 원칙을 고려할 때)입니다.

여전히 많은 코드를 작성하고 기술적으로 많은 코드를 검토해야하는 사람은 항목을 공정하게 검토 할 수 있도록 이러한 원칙을 이해하고 람다 식의 사용이 더 효율적일 수있는 곳을 조언해야합니다. 읽을 수 있고 개발자가 매우 복잡한 인라인 람다 식의 가독성을 고려할 수 있도록합니다 (이 경우 메서드 호출은 코드를보다 읽기 쉽고 유지 보수 가능하며 확장 가능하게 만듭니다).

누군가가 "람다를 얻지 않습니까?" 또는 LINQ 구문을 사용하는 것보다는 루다이 트 가 기본 원리를 이해하도록 돕기 위해 노력합니다. 그들은 결국 나와 같은 "오래된 학교"배경을 가질 수 있습니다.


재미있는 의견-강력한 형식의 정적 언어에서 동적 언어로 전환했을 때이 문제가 발생했습니다. 조정 (두려움과 불신)을 조정하는 데 시간이 걸렸으며 이제는 정직하게 돌아 가기가 어려워졌습니다.
lunchmeat317

4

쿼리가 너무 길면 Lambda Expressions로 인해 코드를 읽을 수 없게됩니다. 그러나 너무 많은 중첩 루프 보다 훨씬 낫습니다 .

두 가지를 혼합 하면 더 좋습니다 .

더 빠르거나 빠르면 읽기 쉬운 Lambda로 작성하십시오.


예. 그러나 linq / lamda 가 읽기 쉽지 않은 이유는 무엇 입니까?
BlackICE

죄송합니다. 대안보다 읽기 쉽지 않았습니다.
BlackICE

1

나는 누군가가 무슨 일이 일어나고 있는지에 대한 아이디어를 얻거나 작은 세부 사항을 쉽게 찾을 수 있는지 여부를 "읽을 수있는"것을 의미하는지에 따라 대부분의 경우 (매우 기괴한 일을 제외하고는) 의존한다고 생각합니다.

링크는 전자에 도움이되지만 종종 (특히 디버깅 할 때) 후자가 아프다고 생각합니다.

코드를 볼 때 IMHO는 전자에 익숙하지 않은 것이 후자보다 훨씬 중요하므로 훨씬 더 읽기 쉽습니다.


좋은 지적. 후자는 일반적으로 좋은 단위 테스트로 덮여 있습니다.
Scott Whitlock

linq 평가의 내부가 모든 세부 사항을 찾기가 어렵다고 생각하십니까? 언제 그런지 예를 들어 줄 수 있습니까?
BlackICE

3
@David : Linq 표현식은 단지 게으른 평가가 아니라 표현식 입니다. linq 표현식의 수신 코드는 실제로 표현식을 수정하여 s-expressions에서 작업하는 lisp 매크로와 같이 완전히 다른 것을 수행 할 수 있습니다. 예를 들어, linq에서 SQL로 작업 할 때 실제로 표현식을 가져 where e.FirstName == "John"와서이를 SQL 쿼리로 변환합니다! 컴파일되지 않은 (그러나 구문 분석 된) 표현식을보고 FirstName지속 된 엔티티에서 호출 된 특성 의 비교를보고 문자열과 비교하는 등의 작업을 수행합니다.
Scott Whitlock

@ david는 일반적으로 linq를 자체적으로 사용하기 전에는 세부 정보를 찾기가 어렵습니다. 내 머리를 감싸는 데 오랜 시간이 걸렸던 "간단한"예는 다음과 같습니다. bugsquash.blogspot.com/2008/07/y-combinator-and-linq.html 그러나 일부에는 더 많은 예가 있습니다. 동적, DynamicObject 및 IDynamicMetaObjectProvider 영역에서 식으로 사람들이하는 일 중 linq가 무엇인지에 관한 선을 그리는 곳은 논란의 여지가 있지만, scott은 linq가 동일한 표현 트리를 사용하기 때문에 linq에서 모든 것을 사용할 수 있다고 지적합니다.
Bill

@ 그래, 난 당신에게 힘든 것을 줄 것이다,하지만 y 조합기 및 고차 함수는 우리 머리의 대부분을 다치게 할 것입니다. 그것은 재귀와 같거나 얻지 못합니다. 재귀 구현은 읽기 쉽습니까 (둘 중 하나를 모르는 경우)?
BlackICE

1

LINQ 구문은 직관적이고 읽기 쉽습니다. 특히 SQL과 같은 중간 대신 FROM을 시작 부분에 배치하기 때문에 특히 그렇습니다. 그러나 IMO 람다는 혼란스럽고 코드를 읽기 어렵게 만듭니다.


람다가 왜 혼란 스럽다고 생각하십니까? 형식 유추입니까?
ChaosPandion

1
@ChaosPandion : 먼저 형식 유추와 둘째, 기호. =와 a를 합치면 누군가가 망쳐 서 뒤로 썼던> =처럼 보이고, 내 두뇌를 반복해서 던지는 경향이있다.
메이슨 휠러

@Mason-Haskell ( \x -> x * x) 또는 F # ( fun x -> x * x) 구문이 마음에 드 십니까?
ChaosPandion

@ChaosPandion : 아니요, 특별히 아닙니다. 람다는 작성하기가 빠르지 만 특히 복잡하지 않은 구문 분석이 어려울 수 있습니다. 귀하의 예는 그렇게 나쁘지는 않지만 훨씬 더 나빠지는 경향이 있습니다.
메이슨 휠러

6
@Mason : 처음에는 라마다에 대한 아이디어에 반대하기보다는 라마다가 라마다 학대당하는 것에 반대하는 것 같습니다.
아논.

1

Linq 구문이 T-SQL과 크게 다르지 않다는 것에 동의합니다. 동료가 실제로 멋지고 반짝이는 OO 코드가 섞여있는 관계형 물건에 반대하고 있다고 생각합니다. 반면에 함수형 프로그래밍에는 약간 익숙해지고 익숙해지기를 원합니다.


0

따라 다릅니다. 분명히, T-SQL은 일부 DB 관계형 솔루션을 고유하게 제공합니다. 분명히 LINQ는 일부 OO 솔루션을 고유하게 제공합니다.

하나; "T-SQL보다 더 혼란 스러운가?" -초기 질문에서 논의 / 질문됩니다. 이것은 기존의 답변 중 어느 것도 해결하지 못하고 과거에 갇혀 있다고 (명백하게 SQL에 익숙한) 비평가를 비난하는 일부 기능을 분명히 의미합니다.

따라서 특정 품질에 대해 LINQ에 감사하고 기존 답변에 크게 동의하지 않더라도 반대 점은 대표 할 만하다고 생각합니다.

LINQ에 익숙해지면서 몇 년이 지난 후에도 특정 유형의 그룹 작업, 외부 조인 및 비 균등 조인, 복합 키 작업 및 LINQ의 다른 작업을 수행해도 여전히 위험에 빠지게됩니다. (특히 성능에 민감한 질문으로 관계형 백엔드를 대상으로하는 경우)

from c in categories
join p in products on c equals p.Category into ps
from p in ps.DefaultIfEmpty()

그것이 직관적이라고 생각한다면, 당신에게는 더 많은 힘이 있습니다. ;)


-4

Linq가 짜증나는 이유가있을 수 있습니다. 이러한 교과서 예제 대신 실제 사례를 만들어보십시오.

linqlamdathings 에서이 기능을 보여 주려고하면 고전적인 방법으로 읽을 수있는 동안 모든 아름다움이 사라 졌다는 것을 알 수 있습니다. 지연된 실행 문제와 설정 중단 점은 말할 것도 없습니다.

진실은 LinqLambda입니다. 몇 가지 경우에 매우 유용하며 여러분이 결코 이해하지 못하는 모든 멋진 객체 방향을 대체하지는 않습니다.

    public IList<Customer> GetVipCustomers(IList<Customer> source, int maxCount)
    {
        var results = new SortedList<string,Customer>();

        foreach (Customer c in source)
        {
            if (maxCount == results.Count)
                break;

            if (c.IsVip && c.FirstName== "Aaron" || c.SecondName== "Aaron")
                results.Add(c.LastName, c);
        }

        return results.Values;
    }

6
나는 그것이 source.Where(c => c.IsVip && c.FirstName == "Aaron" || c.SecondName == "Aaron").Take(maxCount).OrderBy(d => d.LastName);당신의 것을 읽기가 어렵다고 생각하기 때문에 실수를 저지른 것 같습니다;)
jk.

1
이것을 어떻게 교과서의 예라고 생각 했습니까? 그것은 실제로 프로덕션 사용 코드입니다. 모든 사람이 변환 할 것을 기대하는 대신 비교할 수 있도록 클래식 "판독 가능"코드와 linq / lamda 버전을 모두 제공하면 도움이됩니다.
BlackICE

3
LINQ에 대해 불평하기 위해 특별히 등록 했습니까?
KChaloux

1
@KChaloux 나는 그들이 정직하기 위해 트롤링을하고 있다고 생각합니다
jk.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.