1

配列内の特定のセルに特定の文字列の一部が含まれているかどうかを調べようとしています。配列は.Containsを使用しないので、私は.Anyを使用していますが、.Anyがどのように機能するかについての私の理解は、それを正しく理解するにはあまりにも曖昧なようです。

public void ProcessCSV (string typeName) {

    for (int y = 0; y < CSVReader.grid.GetUpperBound(1); y++) {
        if (CSVReader.grid[0,y] != null) {
            if ((CSVReader.grid[0,y].Any(s => typeName.Contains(s)))) {
                  // (add it to a new list)

したがって、「Pork」、「Farm」などの文字列をフィードしています。たとえば、typeNameが「Farm」の場合、[0、y]にその文字列を含む配列からのみ行を取得するなど、完全に機能するように見えることがあります。ただし、Farm、別の文字列、またはランダムなジブリッシュを使用している場合は、文字列を含むすべての行が返されるだけです。

私が電話したとき、実際に何が起こっているのですか。使用できる別の方法はありますか?

4

1 に答える 1

5

あなたはおそらくそれを間違った方法で持っています。

Anyシーケンス内のいずれかの要素が条件を満たしているかどうかを示すブール値を返します。入力するとAny(s => ...)sはチェックされるシーケンスの要素です。

したがって、次のように入力すると:

.Any(s => typeName.Contains(s))

...あなたは本質的に尋ねています:

文字列に含まれているシーケンスの要素はありますtypeNameか?

たとえば、の場合、はtypeName。の場合にのみ返されます。あなたはおそらくそれを逆に意味しました:PorkAny()true"Pork".Contains("ork")

.Any(s => s.Contains(typeName))

文字列を含む要素はありますtypeNameか?

したがって、"Pork and beef".Contains("Pork")が返されますtrue


条件を満たすシーケンスの最初のFirstOrDefault要素(ブール値の真理ではなく)が必要な場合は、を使用します(または、常に少なくとも1つあることがわかっている場合は、First代わりに使用できます)。例えば:

.FirstOrDefault(s => typeName.Contains(s))

文字列に含まれているシーケンスから最初の要素を返しますtypeName; または、存在しない場合のデフォルト値。

または、その逆(私はまだあなたが意味していると思います):

.FirstOrDefault(s => s.Contains(typeName))

文字列を含むシーケンスから最初の要素を返しますtypeName; または、存在しない場合のデフォルト値。

于 2013-03-05T02:36:23.867 に答える