这段代码有什么问题?列表为什么不识别?

时间:2013-03-12 16:20:54

标签: asp.net .net asp.net-mvc

这段代码有什么问题?

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变得虚假? 由于我知道该值存在,我如何调整代码?

6 个答案:

答案 0 :(得分:4)

报告错误是因为您没有询问列表是否包含currentClaimControlNo,而是询问它是否包含一个字符串,该字符串是十五个字符的字符串currentClaimControlNo中的前十四个字符。

请改为尝试:

 claimExists = claimControlNo.Any(ccn => ccn.StartsWith(currentClaimControlNo.Substring(0,14)));

答案 1 :(得分:2)

你的计数错了。有15个字符。您的子字符串正在切断最后一个0,这会使条件失败。

答案 2 :(得分: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。

他们不一样,因此你的困惑

答案 3 :(得分:2)

你真的需要这个解释吗?

当字符串的长度为15时,您正在为Substring调用14个字符。然后您要检查您的列表(只有一个长度为15的项目)是否包含长度为14的项目。它没有; t事件需要检查值,长度足以确定它不匹配。

解决方案当然是不做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));

答案 4 :(得分:2)

因为您正在削减子字符串中的最后一位数字。

如果你改变了行

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

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

它有效。

答案 5 :(得分:1)

检查:

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

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

值str不包含在列表中。