【问题标题】:Comparing data in different structure比较不同结构的数据
【发布时间】:2016-07-26 12:23:10
【问题描述】:

我有一个string

string cubeinline = "12345123451234X1234512345";

等于List<string>

List<string> cube = new List<string>(){ "12345",
                                        "12345",
                                        "1234X",
                                        "12345",
                                        "12345"};

但排列方式不同。字符串按长度拆分。在这种情况下 5.

现在我需要将字符串与列表进行比较 - 逐个字符。但是我的方法说每个字符都是无效的。

int maxLength = 5;
for (int i = 0; i < cubeinline.Length; i++)
{
    if (cubeinline[i] == cube[i / maxLength][i % maxLength])
    {
        Console.WriteLine("Error in char" + i);
    }
}

【问题讨论】:

  • 这就是 == 运算符的用途,是的。 :) 此外,如果您对实际索引不感兴趣,您可以简单地将列表连接成一个字符串并进行一次比较:string.Concat(cube) == cubeinline
  • 我认为这应该作为简单的印刷错误关闭是不是错了?

标签: c# string list


【解决方案1】:

== 更改为!=。您在这里反转逻辑:程序应该在存在差异时显示消息,而不是相等!

【讨论】:

    【解决方案2】:

    你可以这样做:

    string cubeinline = "12345123451234X1234512345";
    List<string> cube = new List<string>(){ "12345",
                                        "12345",
                                        "1234X",
                                        "12345",
                                        "12345"};
    bool isEqual = cubeinline == string.Concat(cube);
    

    【讨论】:

    • String.Concat 在这里可能更合适。
    • 没错,我只是习惯了string.Join,没用过string.Concat。很高兴知道!感谢您的提示
    【解决方案3】:

    我通常为此使用 LINQ。在这种方法中,您使用SequenceEqual 方法检查两个序列(一个是cube,一个是将字符串拆分为5 个大小)并通过比较元素来检查两个序列是否相等:

    bool res = cube.SequenceEqual(Enumerable.Range(0, cubeinline.Length / 5)
        .Select(i => cubeinline.Substring(i * 5, 5)));
    

    【讨论】:

    • 解释它是如何工作的很有意义。对我来说,它看起来效率很低(Range() 分配内存,对吗?)。
    • @Sinatr 我会说效率低下在于它创建的所有临时子字符串。
    • @Sinatr 这只是 OP 可以使用的另一个选项,它通过比较元素是否相等来检查两个序列(一个是 cube,一个是将字符串拆分为 5 个大小)。
    • @Sinatr 例如,考虑到使用的内存量和运行两者的时间不会有太大差异。你必须有一个大字符串并测试两者,看看你有什么类型的内存和运行时差异。
    【解决方案4】:

    将 if 条件更改为

    if ( cubeinline[i] != cube[i / maxLength][i % maxLength] )
    {
        Console.WriteLine ("Error in char" + i);
    }
    

    或者请添加其他条件,

    if ( cubeinline[i] == cube[i / maxLength][i % maxLength] )
    {
        Console.WriteLine ("Match found at " + i);
    }
    else
    {
        Console.WriteLine ("Error in char" + i);
    }
    

    【讨论】:

    • 是的,Sinatr,你是对的。在匹配的情况下,它会给程序输出增加很多噪音。但是这个 if/else 解决方案是让 OP 了解第一个 if 条件是为了匹配(实际上不是为了不匹配)。
    【解决方案5】:

    将字符串存储在列表中的原因是什么?即使您必须将它们保留在列表中,您也可以使用string temp 变量将列表中的字符串组合成一个字符串,然后使用String.Equals 方法比较您的字符串和临时字符串。

    此方法更适合基于值比较字符串,因为 == 检查引用相等性。这是another question you should check out

    【讨论】:

    • == 在这种情况下不检查引用相等性,因为它们正在比较 char(一个结构),但即使使用 string,一个引用类型,它仍然比较值而不是引用,因为运算符重载。如果您想要值相等而不是引用,您只需要确保被引用的类型已重载(但大多数.Net 类您希望对其进行值比较都会重载它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2016-04-25
    • 2019-02-24
    • 2014-06-02
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多