C# 如何比较行(一行随机序列)
我想比较两行,但其中一行是随机序列。我使用文本框,如下所示: 文本框1:C# 如何比较行(一行随机序列),c#,comparison,C#,Comparison,我想比较两行,但其中一行是随机序列。我使用文本框,如下所示: 文本框1: 朋友们 伙伴 大象 文本框2: aspl 现在,当我按下按钮时,我希望Textbox3显示以下内容: 文本框3: 伙伴 到目前为止,我得到的是: Textbox3.Clear(); string[] lines1 = Textbox2.Lines; foreach (string line1 in lines1) {
朋友们
伙伴
大象
文本框2:
aspl 现在,当我按下按钮时,我希望Textbox3显示以下内容: 文本框3:
伙伴 到目前为止,我得到的是:
Textbox3.Clear();
string[] lines1 = Textbox2.Lines;
foreach (string line1 in lines1)
{
string[] lines = Textbox1.Lines;
foreach (string line in lines)
{
if (line.Contains(line1))
{
Textbox3.Text += line;
Textbox3.Text += "\r\n";
}
}
}
但是,如果Textbox1和Textbox2中的行完全相同,而不仅仅是字符完全相同,则这将仅将该行复制到Textbox3
所以我的问题是:我如何做到这一点?我会反复浏览这两个列表。如果字符串的长度相同,请继续(潜在匹配)。给定一个可能的匹配(相同的字符串长度),然后遍历源字符串中的字符,并确保每个字符都存在于要比较的字符串中。您必须生成随机输入的所有可能排列,然后将每个字符与数据进行比较。就像Nathaniel说的,你可以通过先检查长度来优化它 有关生成字符串排列的代码,请参阅(您将希望获得随机输入字符串的所有字符排列) 编辑
问题的答案是:有一个更适合您需要的置换生成器。只需将
List
参数添加到go
和setper
方法中,并替换Console.Write(List)代码>显示结果。添加(列表)
。当该方法返回时,您提供的列表将包含所有排列。我的方法是
计算目标单词(textbox2)的每个字母出现的次数
循环浏览您拥有的可能条目列表(textbox1)
计算您可能输入的每个字母出现的次数李>
如果匹配,则将word保存到textbox3,如果不匹配,则继续
如前所述,为了使此过程更快,请先计算可能单词的字符串长度,如果不匹配,则放弃此单词并继续下一个单词
另一个增强功能是,在计算可能条目的字母时,如果发现目标单词中没有字母,则放弃,继续下一个单词。只需对字符串进行排序,并比较结果,假设它们的长度相等且不为空。此功能:
private static bool IsPermutation(string one, string two)
{
var oneSorted = String.Join("", one.OrderBy(c => c).Select(x => x.ToString()).ToArray());
var twoSorted = String.Join("", two.OrderBy(c => c).Select(x => x.ToString()).ToArray());
return oneSorted == twoSorted;
}
编辑:回答评论。将该方法添加到类中,并用替换foreach中的代码
if (line.Length == line1.Length && IsPermutation(line, line1))
{
Textbox3.Text += line;
Textbox3.Text += "\r\n";
}
是否仅复制顺序相同的行?还是要忽略行的顺序以及字符?他没有说明是否关心行的顺序。我知道现有的代码要求它们的顺序相同,但这并不意味着这就是OP真正想要的。顺便说一句,我没有否决投票……除非从字符串中删除匹配的字符,否则将失败。如果不匹配,则aabc将与abbc匹配(aabc中的每个字符都存在于abbc中,且字符串长度相等)。无否决票,因为这将起作用。但你绝对不必这么做。更快的方法是计算字符并将它们填入char->count的字典中,然后比较字典。想想看,分类列表也可以。我同意,对于任何长度相当大的字符串,排列速度都会非常慢。我打赌这是可行的,但它太复杂了,我无法让代码对我有任何意义。这看起来很好,但你能解释一下如何使用它吗?