2010-04-01 4 views
1

내 자신의 LINQ 참조를 쓰고 있지만 더 복잡한 연산자 구현에 문제가 있습니다.Join + IEqualityComparer <T> 및 HashCode

IEqualityComparer Im을 사용하는 Join 구현이 있습니다.

List<string> initials = new List<string> {"A", "B", "C", "D", "E"}; 

List<string> words = new List<string> {"Ant", "Crawl", "Pig", "Boat", "Elephant", "Arc"}; 

아무것도 이상한 여기 :이 두 목록 (명백하게)

이미지를 쓰기 전에 먼저 이해하려고 노력

임.

= 초기 단어 = 개미
초기 = A 워드 = 아크
초기 = B 말씀 = 보트
...

: 내가 좋아하는 초기, 뭔가에 의해 두 목록에 가입 할 자신을 가입

public class InitialComparator : IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.StartsWith(y); 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj[0].GetHashCode(); 
    } 
} 

:

01 내가 비교기가 필요

, 내가 쓴

var blah = initials.Join(words, 
            initial => initial, 
            word => word, 
            (initial, word) => 
            new {Initial = initial, Word = word}, 
            new InitialComparator()); 

디버깅의 좋은 세션 이후에 나는 처음으로 HashCodes를 사용합니다. 다른 단어에 동일한 HashCode가 있으면 equals라고하는 모든 단어가 비교기로 이동하여 HashCode를 봅니다. 내가 비교하려는 때문에 난 그냥 첫 글자 해시를 필요

단지 초기 I 불구하고 (나는? 잘못된 건가요)

것은이 제대로 작동하지 않는 것입니다. 그것은 "개미"와 "호"가 같음이라고 말합니다. 좋아요, 같은 목록에있는 모든 단어를 비교하는 것입니다. 그러나 발견 한 마지막 단어 만 추가합니다.이 경우 아크, 앤트를 무시하고 앤트는 "A "너무 ...

"개미 "와"개미 "를 넣으면 둘 다 추가됩니다.

간단히 말해서, 그런 식으로 일하는 방법은 무엇입니까? 나는 뭔가 잘못하고있는 것을 알고있다.

감사합니다.

+1

귀하의 질문에 답변하지 않지만 귀하의 Equals 방법에 결함이 있습니다.현재 구현에서는 "Ants"는 "Ant"와 같지만 "Ant"는 "Ants"와 같지 않습니다. –

+0

답변이 아니라 ver 좋은 의견입니다. 그 별난, 조금 더 설명 할 수 있니? 당신이 옳았. "개미"와 "개미"둘 다 추가합니다. "개미"와 "개미"는 개미를 추가하고 "개미"와 "개미"가 동일하다고 말합니다. 나는 왜 그런지 이해하지 못한다. –

+1

StartsWith는 인스턴스가 초기 값뿐만 아니라 매개 변수로 완전히 시작되면 true를 반환합니다. 매개 변수가 인스턴스 내에 _ 포함되어 인스턴스의 시작 부분에있는 경우 true를 반환하는 또 다른 방법입니다. 그래서 "Ant".StartsWith ("Ants")는 인스턴스에 's'가 없으므로 false입니다. – Crispy

답변

0

바삭가 시도 언급 한 바와 같이 X [0] == Y [0] 대신 을의 x.StartsWith (y); 그건 나를 위해 일했습니다.

0

나는이 동작을보고있는 이유는 모르겠지만, "SelectMany는"더 간단 접근하고 (더 중요한) 당신이 원하는 행동이 것 사용하여 생각 :

var blah = 
    from word in words 
    from initial in initials 
    where (word.StartsWith(initial)) 
    select new { Initial = initial, Word = word }; 

내가 선호를 가능한 경우 이해력 구문을 사용합니다. "SelectMany"는 이해 쿼리에 "from"절이 여러 개있을 때 호출됩니다.

+0

그래,하지만 나는 스페인어로 LINQ 연산자 '참조를 writting 말했다. 이제 Join 연산자를 사용하면 IEqualityComparer를 사용한 Join에 대한 예제가 필요하다. 가능한 경우 더 많은 연산자가 필요하지 않은 단순한 것. 나는 바보가 아닌 뭔가를 위해 몇 시간을 생각하고 있었다. 나는 그 일이 단순하기 때문에 끝났지 만, 나는 그것을 작동시킬 수 없다. –

2

당신은 실제로 너무 같은 개인 편지에 가입, 자신의 같음 비교가 필요하지 않습니다 :

var mine = from i in initials 
    join w in words on i[0] equals w[0] 
    select new { 
      Initial = i, 
      Words = w 
    };
+0

난 비교자를 사용해야 ... –

+0

그럼 당신은 그냥 당신이 평등 방법을 수정할 수있을 것 같아요,하지만 난 정말 궁금해서 당신이 사용자 지정 비교기를 사용해야합니다. ' bool 같음 (문자열 x, 문자열 y) { \t return x [0] == y [0]; } ' – Crispy

+0

저는 두 번 말했습니다. 모든 구현체가있는 모든 연산자에 대한 참조를 작성했습니다.이 중 하나는 조인 + 비교 자입니다. 문제는 단지 Equals 메서드에 불과했습니다. –

관련 문제