【问题标题】:C# .Contains not returning correct result [closed]C# .Contains 不返回正确的结果[关闭]
【发布时间】:2018-03-16 15:47:11
【问题描述】:

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

我的地址文件如下所示:

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

当我运行代码时,它会为“NEW SOUTH WALE”返回 true,但它会为“SOUTH AUSTRALI”返回 false

为什么它不为 'SOUTH AUSTRALI' 返回 true,因为它包含在 'SOUTH AUSTRALIA' 中?

下面是代码供参考:

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++;
        }
    }
}

【问题讨论】:

  • 如果您替换实际值,您会发现这正是它应该做的:"SOUTH AUSTRALI".Contains("SOUTH AUSTRALIA") 这显然是错误的
  • 由于 Liam 更正之前的原始代码显然无法编译,因此它显然不是实际代码,也不是为演示而创建的minimal reproducible example问题。谁知道这段代码是否会出现同样的问题
  • 代码能编译吗?
  • @Liam - 未终止的字符串常量不
  • @user3394486 Damien 的意思是您最初发布的代码(后来被其他人修复)无效,确实如此;但是既然它现在已经修复了,最好我们都继续前进......

标签: c# contains


【解决方案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

【讨论】:

    【解决方案2】:

    您正在遍历 foreach 循环中的行,因此最终您将获得 s = "SOUTH AUSTRALI" 的值。现在看看你的代码:

    if (states.Any(line.Contains)) - 读作“状态中的任何项目是否满足“南澳大利亚”完全包含它的标准?”

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

    如果您将该条件更改为:

    if (states.Any(x=>x.Contains(line))) - 现在你在问“状态中的任何项目是否满足其自身包含“南澳大利亚”的标准? SOUTH AUSTRALIA 可以,这会返回预期的结果。

    顺便说一句,出于同样的原因,您最初发布的代码不会为“NEW SOUTH WALE”返回 true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2016-02-06
      • 2017-05-09
      • 1970-01-01
      相关资源
      最近更新 更多