2013-03-12 52 views
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上面会出现错误? 由于我知道价值存在,我如何调整代码?

+2

的困惑在于事实'子串(INT,INT)'是'子字符串(偏移,长度)',而不是'子串(的startIndex,stopIndex)' – Gus 2013-03-12 16:27:58

+0

什么你想实现不明确。你不是在寻找确切的字符串,或者你不会使用子字符串。我猜@安妮。已经指出了你的目标。那么,它会是平等的,包含,startswith? – jbl 2013-03-12 16:29:42

回答

4

它报告错误,因为您不问清单中是否包含currentClaimControlNo,而是询问它是否包含字符串,该字符串是十五个字符的字符串currentClaimControlNo的前十四个字符。

试试这个:

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

这也是一样的...... – Rita 2013-03-12 16:27:49

+0

我在发布前2分钟编辑了我的回答。你有没有得到更高版本(使用String.StartsWith)? – 2013-03-12 16:30:47

2

您的点数不对。有15个字符。您的子字符串将切断最后一个不符合条件的0。

2

因为名单上包含看起来整个项目,而不是一个字符串:

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。

他们是不一样的,所以你的困惑

1

一下:

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

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

值str是不包含在列表中。

2

你真的需要这个解释吗?

当字符串的长度为15时,您要求Substring为14个字符。然后检查您的列表(其中只有一个长度为15的项目)是否包含长度为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)); 
+0

因为我知道价值存在,我该如何编写代码? – Rita 2013-03-12 16:28:56

2

因为你剃过在你的子字符串中的最后一位。

如果你改变了行

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

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

它的工作原理。

+0

我知道比认为我能及时回答这个问题要好:-) – GojiraDeMonstah 2013-03-12 16:27:22