내 자신의 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 "너무 ...
"개미 "와"개미 "를 넣으면 둘 다 추가됩니다.
간단히 말해서, 그런 식으로 일하는 방법은 무엇입니까? 나는 뭔가 잘못하고있는 것을 알고있다.
감사합니다.
귀하의 질문에 답변하지 않지만 귀하의 Equals 방법에 결함이 있습니다.현재 구현에서는 "Ants"는 "Ant"와 같지만 "Ant"는 "Ants"와 같지 않습니다. –
답변이 아니라 ver 좋은 의견입니다. 그 별난, 조금 더 설명 할 수 있니? 당신이 옳았. "개미"와 "개미"둘 다 추가합니다. "개미"와 "개미"는 개미를 추가하고 "개미"와 "개미"가 동일하다고 말합니다. 나는 왜 그런지 이해하지 못한다. –
StartsWith는 인스턴스가 초기 값뿐만 아니라 매개 변수로 완전히 시작되면 true를 반환합니다. 매개 변수가 인스턴스 내에 _ 포함되어 인스턴스의 시작 부분에있는 경우 true를 반환하는 또 다른 방법입니다. 그래서 "Ant".StartsWith ("Ants")는 인스턴스에 's'가 없으므로 false입니다. – Crispy