2

独自の LINQ リファレンスを作成していますが、より複雑な演算子の実装で問題が発生しています。

IEqualityComparer を使用する Join 実装があります。

書く前にまずそれを理解しようとしています(明らかに)

この2つのリストをイメージしてください:

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

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

ここで奇妙なことは何もありません。次のようなイニシャルで両方のリストに参加したい:

イニシャル=A ワード=アリ
イニシャル=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();
    }
}

結合自体:

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

HashCodes を使用するのは初めてです。デバッグの適切なセッションの後、すべての単語がコンパレーターに移動し、その HashCode を確認します。

イニシャルだけを比較したいので、最初の文字のハッシュだけが必要だと思います(間違っていますか?)

問題は、これが正しく機能していないことです。「Ant」と「Arc」は等しいと言われています。わかりました、同じリスト内のすべての単語を比較するかどうかですが、最後に見つかった単語のみを追加します。この場合、Arc で、Ant を無視し、Ant は「A に等しい」 " それも...

"Ant" と "Ant" を入力すると、両方が追加されます。

要するに、そのようなことをする方法は何ですか?私は何か間違ったことをしていることを知っています。

ありがとうございました。

4

3 に答える 3

2

実際には独自の等値比較子は必要ありません。次のように個々の文字を結合するだけです。

var mine = イニシャルの i から
     i[0] の単語で w を結合すると w[0] に等しい
     新しい{を選択
          イニシャル = i,
          単語 = w
     };
于 2010-04-01T21:17:29.330 に答える
0

この動作が見られる理由はわかりませんが、「SelectMany」を使用する方がより簡単なアプローチであり、(さらに重要なことに) 必要な動作が得られると思います。

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

可能な場合は、理解構文を使用することを好みます。"SelectMany" は、内包クエリに複数の "from" 句がある場合に呼び出されます。

于 2010-04-01T21:12:04.303 に答える
0

Crispy が述べたように、 x.StartsWith(y); の代わりに x[0] == y[0] を試してください。それは私のために働いた。

于 2010-04-01T21:40:42.603 に答える