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 会变成假?既然我知道该值存在,我该如何调整代码?

4

6 回答 6

4

它报告错误,因为您不是在询问列表是否包含currentClaimControlNo,而是在询问它是否包含一个字符串,该字符串是 15 个字符的前 14 个字符currentClaimControlNo

试试这个:

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

你的计数是错误的。有 15 个字符。您的子字符串正在切断最后一个不符合条件的 0。

于 2013-03-12T16:23:31.203 回答
2

因为列表中的 contains 查找整个项目,而不是子字符串:

currentClaimControlNo.Substring(0, 14)
"70020930839987"

不一样

 700209308399870

您缺少一个数字,因此您的列表搜索失败了。

我认为您正在尝试在包含该子字符串的列表中查找某些内容。不要使用列表包含方法。如果您试图在列表中找到包含子集的内容,请执行此操作

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 时,您调用Substring14 个字符。然后您正在检查您的列表(只有一个长度为 15 的项目)是否包含长度为 14 的项目。它不需要检查值,长度足以确定它不匹配。

解决方案当然是不做Substring,这是没有意义的。

看起来像这样:

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

再说一次,也许您知道您正在修剪搜索,并且实际上正在寻找列表中具有部分匹配的任何内容?

如果是这种情况,那么您可以简单地循环列表并对Contains每个项目执行 a 。像这样的东西:

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 回答
2

因为您正在删除子字符串中的最后一个数字。

如果你换行

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

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

有用。

于 2013-03-12T16:25:25.950 回答
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 回答