Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较不同结构中的数据_C#_String_List - Fatal编程技术网

C# 比较不同结构中的数据

C# 比较不同结构中的数据,c#,string,list,C#,String,List,我有一个字符串 string cubeinline = "12345123451234X1234512345"; 这相当于一个列表 List cube=new List(){“12345”, "12345", “1234X”, "12345", "12345"}; 但是不同的安排。字符串按长度分开。在这种情况下,5 现在,我需要将字符串与列表逐字符进行比较。但是我的方法说每个字符都是无效的 int maxLength = 5; for (int i = 0; i < cubeinlin

我有一个
字符串

string cubeinline = "12345123451234X1234512345";
这相当于一个
列表

List cube=new List(){“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);
    }
}
int maxLength=5;
for(int i=0;i
==
更改为
=。您可以在这里反转逻辑:当存在差异时,程序应该显示消息,而不是相等

您可以这样做:

string cubeinline = "12345123451234X1234512345";
List<string> cube = new List<string>(){ "12345",
                                    "12345",
                                    "1234X",
                                    "12345",
                                    "12345"};
bool isEqual = cubeinline == string.Concat(cube);
string cubeinline=“12345123451234x134512345”;
列表多维数据集=新列表(){“12345”,
"12345",
“1234X”,
"12345",
"12345"};
bool isEqual=cubeinline==string.Concat(立方体);

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

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

将您的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);
}

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


此方法更适合基于值比较字符串,因为
=
检查引用相等性。这里。

这就是
=
操作符的作用,是的。:)此外,如果您对实际索引不感兴趣,您可以简单地将列表压缩成字符串并进行单个比较:
string.concat(cube)==cubeinline
。我认为这应该作为简单的印刷错误关闭,这是错的吗?在这里可能更合适。没错,我只是习惯于string.Join,从未使用过string.Concat。很高兴知道!谢谢你的提示,解释一下它是如何工作的。在我看来,它的效率很高(
Range()
allocate memory,对吗?)@Sinatr我想说,效率低下的原因是它创建的所有临时子字符串。@Sinatr这只是OP可以使用的另一个选项,它检查两个序列(一个是
cube
,另一个是将一个字符串拆分为5个大小)通过比较元素与否,两者是相等的。@Sinatr对于示例来说,给定所使用的内存量和运行这两个元素的时间不会有太大的差异。您必须使用一个大字符串并测试这两个字符串,以查看内存类型和运行时差异。在本例中,
=
不检查引用相等性,因为它们比较的是
char
(结构),但即使是
string
,引用类型,它仍然比较值而不是引用,因为运算符重载。如果您希望值相等而不是引用,您只需确保被引用的类型重载了它(但您希望对其进行值比较的大多数.Net类都重载了它)。是的,Sinatr,您是对的。在匹配的情况下,它会给程序输出增加很多噪声。但这个if/else解决方案是让OP了解到,如果条件是用于匹配的(实际上不是用于不匹配的)。
if ( cubeinline[i] == cube[i / maxLength][i % maxLength] )
{
    Console.WriteLine ("Match found at " + i);
}
else
{
    Console.WriteLine ("Error in char" + i);
}