C#。包含没有返回正确的结果

时间:2018-03-16 15:47:12

标签: c# contains

我有一个包含地址的文件,我想检查地址是否正确。我将地址与澳大利亚批准的州名单进行比较。

我的地址文件如下所示:

NEW SOUTH WALE 
N S W 2232    
SOUTH AUSTRALI
Victoria      
SA 5158       
Victoria 3136 
Victoria 3029 
N.S.W. 2428   

我的批准澳大利亚州的文件是:

NEW SOUTH WALES
QUEENSLAND
SOUTH AUSTRALIA
TASMANIA
VICTORIA
WESTERN AUSTRALIA

当我运行代码时,它将返回true,因为“NEW SOUTH WALE'但是对于南澳大利亚州来说,它会返回错误的

为什么南澳大利亚'因为它包含在“南澳大利亚”中。 ?

以下是供参考的代码:

static void Main(string[] args)
{
    string[] lines = File.ReadAllLines(@"C:\C# Project\sampledata.dat");
    var states = File.ReadAllLines(@"C:\C# Project\States.txt"); //Reads in states
    int i = 1;
    foreach (string line in lines) //Loops through data
    { 
        if (states.Any(line.Contains)) 
        {
            File.AppendAllText(@"C:\C# Project\CorrectAddress.dat", 
                line + Environment.NewLine);
            i++;            
        }
        else
        {
            File.AppendAllText(@"C:\C# Project\IncorrectAddress.dat", 
                line + Environment.NewLine);
            i++;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您正在迭代foreach循环中的行,因此最终,您的值为s = "SOUTH AUSTRALI"。现在看看你的代码:

if (states.Any(line.Contains)) - 其内容为"州内的任何项目是否满足" SOUTH AUSTRALI"完全包含它?"

答案当然是否定的,因为您提供的州名并不完全符合该字符串。

如果您将该条件更改为:

if (states.Any(x=>x.Contains(line))) - 现在你要问"州内的任何项目是否满足它所包含的标准"南澳大利亚"在其内部?"。南澳大利亚确实如此,这将返回预期的结果。

顺便说一句,由于同样的原因,您最初发布的代码并不会因为#SOUTH; NEW SOUTH WALE"而返回。

答案 1 :(得分:1)

代码如果你替换实际值,你会发现这正是它应该做的:

"SOUTH AUSTRALI".Contains("SOUTH AUSTRALIA") 

这显然是假的。

您正在寻找行中包含的。使用原始数据,以下代码不会打印任何内容,因为没有匹配:

var lines=new[]{"NEW SOUTH WALE","SOUTH AUSTRALI"};
var states = new[]{"NEW SOUTH WALES","SOUTH AUSTRALIA"};

foreach(var s in lines)
{
    if (states.Any(s.Contains))
    {
        Console.WriteLine(s)
    }
}

如果你想找到部分匹配状态的行,你可以反转这些调用。

foreach(var s in lines)
{
    if (states.Any(state=>state.Contains(s)))
    {
        Console.WriteLine(s)
    }
}

这将打印:

NEW SOUTH WALE
SOUTH AUSTRALI