【问题标题】:Comparing 2 strings c#比较2个字符串c#
【发布时间】:2015-08-31 17:31:31
【问题描述】:

所以我有一个字符串,我将其分成两半。现在我需要比较字符串的两个部分,并且输出必须是它们中相同的所有元素。


我注意到有些人在使用 Intersect,但我不知道为什么它对我不起作用,如果我使用它,我会得到非常奇怪的输出。

这是我的代码:

string first= "1 3 6 8 4 11 34 23 3 1 7 22 24 8"
int firstLength = first.Length;
        int half = firstLength / 2;
        string S1 = first.Substring(0, half);
        string  S2= first.Substring(half, half);

        var areInCommon = S1.Intersect(S2);

        Console.WriteLine("Numbers that these 2 strings have in common are: ");
        foreach (int i in areInCommon)
            Console.WriteLine(i);

所以在这种情况下,输出将是:1、3 和 8。

任何帮助将不胜感激。

【问题讨论】:

  • 在子字符串行后分割空格
  • 字符串只是一个字符序列。即使这个特定的字符串在您看来是一个数字序列(其中一些有两位数),但字符串本身并不关心这一点。它只关心单个字符:'1', ' ', '3', ' ', '6', ' ', '8', ' ', '4', @98765433 @、'1' 等等。因此,Intersect 方法将对单个字符而不是数字进行操作。

标签: c# string compare


【解决方案1】:

你很接近你真正想要的是数字数组而不是字符数组......你可以使用 split 函数来实现。

string first= "1 3 6 8 4 11 34 23 3 1 7 22 24 8"
int firstLength = first.Length;
int half = firstLength / 2;
string S1 = first.Substring(0, half);
string  S2= first.Substring(half, half);

var areInCommon = S1.Split(" ".ToArray()).Intersect(S2.Split(" ".ToArray());

Console.WriteLine("Numbers that these 2 strings have in common are: ");
foreach (var i in areInCommon)
    Console.WriteLine(i);

关于使用 ToArray() 的注意事项:

我使用 ToArray() 是出于习惯,原因是如果你想传入参数,没有这个构造你就无法做到。例如,如果数据如下所示:

 string first= "1, 3, 6, 8, 4, 11, 34, 23, 3, 1, 7, 22, 24, 8"

那么我们需要使用

 .Split(" ,".ToArray(), StringSplitOptions.RemoveEmptyEntries);

由于这种情况经常发生,我出于习惯使用.ToArray()。您也可以使用新的构造(例如 new char [] { ' ', ',' } )我觉得这更麻烦,但可能会稍微快一些。

【讨论】:

  • 为什么不只是Split(' ') 而不是Split(" ".ToArray())
  • 是的 public string[] Split (params char[] separator) msdn.microsoft.com/en-us/library/b873y76a(v=vs.110).aspx
  • params 可以让你做类似mystring.Split(' ', '-', '/'); 或只是mystring.Split(' '); 的事情
  • 如果要在 Split 方法中传递 char 参数,请使用单引号。为什么选择 " ".ToArray() ?
【解决方案2】:

只需在一个数组中拆分两个字符串,然后使用contains() 函数比较两个字符串。

【讨论】:

    【解决方案3】:

    string 实现了IEnumerable<char>,因此,您正在交叉字符序列而不是字符串。

    你应该使用String.Split:

    IEnumerable<string> S1 = first.Substring(0, half).Split(' ');
    IEnumerable<string> S2= first.Substring(half, half).Split(' ');
    

    然后你的交集就会输出想要的结果。

    此外,您可以将数字的每个字符串表示形式转换为整数(即​​int):

    IEnumerable<int> S1 = first.Substring(0, half).Split(' ').Select(s => int.Parse(s));
    IEnumerable<int> S2 = first.Substring(half, half).Split(' ').Select(s => int.Parse(s));
    

    【讨论】:

      【解决方案4】:

      您正在将所有字符转换为整数。字符 '1' 不是由整数 1 表示的。将你的 foreach 更改为:

      foreach (char i in areInCommon)
      

      【讨论】:

        猜你喜欢
        • 2019-11-10
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        • 1970-01-01
        • 2015-03-21
        • 1970-01-01
        • 2018-09-16
        • 2015-06-14
        相关资源
        最近更新 更多