在数组中找到最大的连接词
Find biggest concatenation word in array
我是 C# 的新手,有人可以帮助我理解为什么我的代码不起作用吗?
似乎变量 word
有问题需要返回,但我不明白是什么。
public virtual bool concatOnly()
{
int tmp = 0;
foreach (string word in words)
{
tmp += word.Length;
}
return (tmp <= word.Length);
}
我也不太明白我需要做些什么:
public virtual void removeRepeat()
{
IEnumerator<string> iterator = words.GetEnumerator();
string checkWord = null;
while (iterator.MoveNext())
{
checkWord = iterator.Current;
foreach (string tmpWord in words)
{
if (tmpWord.Contains(checkWord) && checkWord.Length < tmpWord.Length)
{
iterator.Remove();
break;
}
}
}
}
更新 3
为了修复第二个编译错误(请参阅更新 2),您需要通过 Iterator 从列表中删除而不这样做,它没有 remove 方法。一种方法如下,它保存索引以供迭代器遍历后删除。请注意,我以相反的顺序删除索引,以便要删除的索引号不会因先前的删除而改变。
public virtual void removeRepeat()
{
IEnumerator<string> iterator = words.GetEnumerator();
string checkWord = null;
List<int> removeIndexes = new List<int>();
int i = -1;
while (iterator.MoveNext())
{
checkWord = iterator.Current;
i++;
foreach (string tmpWord in words)
{
if (tmpWord.Contains(checkWord) && checkWord.Length < tmpWord.Length)
{
removeIndexes.Add(i);
break;
}
}
}
removeIndexes.Reverse();
foreach(var index in removeIndexes) {
words.RemoveAt(index);
}
}
更新 2
修复第一个编译错误后(请参阅下面我的原始答案,现在有效),您的代码仍然给出此编译错误 main.cs(90,38): error CS1061: Type
System.Collections.Generic.IEnumerator' does not contain a definition for Remove' and no extension method
删除'典型值
e `System.Collections.Generic.IEnumerator' 可以找到。
更新
我已将原来的答案更改为至少可以编译的内容。我所做的是将原来的return (tmp <= word.Length);
改回使用word
,这是class成员变量,而不是局部变量。
原版
在方法 concatOnly()
中更改变量 word
的名称:
public virtual bool concatOnly()
{
int tmp = 0;
foreach (string w in words)
{
tmp += w.Length;
}
return (tmp <= word.Length);
}
这是因为你的classConcatWord
,其中concatOnly
是一个成员方法,已经有一个名为word
的成员变量:internal string word;
。
仅供参考,以上显示您还需要 post class ConcatWord 的完整代码。可以将 link 提供给您提供的完整代码,这可能会有所帮助,但是重现错误所需的一切也需要出现在您的问题中。
我是 C# 的新手,有人可以帮助我理解为什么我的代码不起作用吗?
似乎变量 word
有问题需要返回,但我不明白是什么。
public virtual bool concatOnly()
{
int tmp = 0;
foreach (string word in words)
{
tmp += word.Length;
}
return (tmp <= word.Length);
}
我也不太明白我需要做些什么:
public virtual void removeRepeat()
{
IEnumerator<string> iterator = words.GetEnumerator();
string checkWord = null;
while (iterator.MoveNext())
{
checkWord = iterator.Current;
foreach (string tmpWord in words)
{
if (tmpWord.Contains(checkWord) && checkWord.Length < tmpWord.Length)
{
iterator.Remove();
break;
}
}
}
}
更新 3 为了修复第二个编译错误(请参阅更新 2),您需要通过 Iterator 从列表中删除而不这样做,它没有 remove 方法。一种方法如下,它保存索引以供迭代器遍历后删除。请注意,我以相反的顺序删除索引,以便要删除的索引号不会因先前的删除而改变。
public virtual void removeRepeat()
{
IEnumerator<string> iterator = words.GetEnumerator();
string checkWord = null;
List<int> removeIndexes = new List<int>();
int i = -1;
while (iterator.MoveNext())
{
checkWord = iterator.Current;
i++;
foreach (string tmpWord in words)
{
if (tmpWord.Contains(checkWord) && checkWord.Length < tmpWord.Length)
{
removeIndexes.Add(i);
break;
}
}
}
removeIndexes.Reverse();
foreach(var index in removeIndexes) {
words.RemoveAt(index);
}
}
更新 2
修复第一个编译错误后(请参阅下面我的原始答案,现在有效),您的代码仍然给出此编译错误 main.cs(90,38): error CS1061: Type
System.Collections.Generic.IEnumerator' does not contain a definition for Remove' and no extension method
删除'典型值
e `System.Collections.Generic.IEnumerator' 可以找到。
更新
我已将原来的答案更改为至少可以编译的内容。我所做的是将原来的return (tmp <= word.Length);
改回使用word
,这是class成员变量,而不是局部变量。
原版
在方法 concatOnly()
中更改变量 word
的名称:
public virtual bool concatOnly()
{
int tmp = 0;
foreach (string w in words)
{
tmp += w.Length;
}
return (tmp <= word.Length);
}
这是因为你的classConcatWord
,其中concatOnly
是一个成员方法,已经有一个名为word
的成员变量:internal string word;
。
仅供参考,以上显示您还需要 post class ConcatWord 的完整代码。可以将 link 提供给您提供的完整代码,这可能会有所帮助,但是重现错误所需的一切也需要出现在您的问题中。