0

このコードの何が問題になっていますか?

bool claimExists;
        string currentClaimControlNo = "700209308399870";
        List<string> claimControlNo = new List<string>();
        claimControlNo.Add("700209308399870");

        if (claimControlNo.Contains(currentClaimControlNo.Substring(0, 14)))
            claimExists = true;
        else
            claimExists = false;

上記のclaimControlNoがfalseになるのはなぜですか?値が存在することがわかっているので、コードを調整するにはどうすればよいですか?

4

6 に答える 6

4

currentClaimControlNoリストにが含まれているかどうかを尋ねているのではなく、15文字の文字列の最初の14文字である文字列が含まれているかどうかを尋ねているため、falseが報告されていますcurrentClaimControlNo

代わりにこれを試してください:

 claimExists = claimControlNo.Any(ccn => ccn.StartsWith(currentClaimControlNo.Substring(0,14)));
于 2013-03-12T16:25:35.193 に答える
2

部分文字列の最後の桁を削っているからです。

行を変更した場合

if (claimControlNo.Contains(currentClaimControlNo.Substring(0, 14)))

if (claimControlNo.Contains(currentClaimControlNo.Substring(0, 15)))

できます。

于 2013-03-12T16:25:25.950 に答える
2

あなたのカウントは間違っています。15文字あります。あなたの部分文字列は、条件を満たしていない最後の0を切り取っています。

于 2013-03-12T16:23:31.203 に答える
2

リストのcontainsは、サブストリングではなく、アイテム全体を検索するため、次のようになります。

currentClaimControlNo.Substring(0, 14)
"70020930839987"

と同じではありません

 700209308399870

数字が欠落しているため、リスト検索が失敗するのはなぜですか。

その部分文字列を含むリストから何かを見つけようとしていると思います。リストcontainsメソッドは使用しないでください。サブセットを持つリストで何かを見つけようとしている場合は、これを実行してください

claimExists = claimControlNo.Any(item => item.Contains(currentClaimControlNo.Substring(0, 14)))

これにより、の各アイテムが調べられclaimControlNo、各アイテムにサブストリングが含まれているかどうかを確認できます。

なぜこのようにするのですか?文字列のContainsメソッド

指定されたSystem.Stringオブジェクトがこの文字列内にあるかどうかを示す値を返します。

どちらが欲しいのか。

Containsただし、リストには

要素がSystem.Collections.Generic.Listにあるかどうかを判別します。

それらは同じではないので、あなたの混乱

于 2013-03-12T16:23:31.827 に答える
2

あなたは本当にこれを説明する必要がありますか?

文字列の長さが15の場合、14文字を要求Substringしています。次に、リスト(長さ15の項目が1つしかない)に長さ14の項目が含まれているかどうかを確認しています。値を確認する必要はありません。長さは、一致していないと判断するのに十分です。

もちろん、解決策は実行しSubstringないことです。それは意味がありません。

これは次のようになります。

if (claimControlNo.Contains(currentClaimControlNo))
    claimExists = true;
else
    claimExists = false;

繰り返しになりますが、検索をトリミングしていることを知っていて、実際にリスト内で部分的に一致するものを探しているのではないでしょうか。

この場合は、リストをループしContainsて各アイテムに対してを実行できます。このようなもの:

bool claimExists = false;
string searchString = currentClaimControlNo.Substring(0, 14);
foreach(var s in claimControlNo)
{
   if(s.Contains(searchString))
   {
      claimExists = true;
      break;
   }
}

または、少し複雑なLINQクエリを使用します(頭のてっぺんから覚えているよりも確かに複雑です)。簡単な推測(公平であるのはおそらく正しいです、私はかなりおかしくなります):

bool claimExists = claimControlNo.Any(x => x.Contains(searchString));
于 2013-03-12T16:24:16.320 に答える
1

それをチェックしてください:

// str will be equal to 70020930839987
var str = currentClaimControlNo.Substring(0, 14);

List<string> claimControlNo = new List<string>();
claimControlNo.Add("700209308399870");

値strはリストに含まれていません。

于 2013-03-12T16:24:14.937 に答える