C# 循环遍历字符串数组并与以前的值进行比较
我需要遍历一个字符串数组,并知道我以前是否见过一个特定的字符串值。通常,我会用其他语言写类似的东西:C# 循环遍历字符串数组并与以前的值进行比较,c#,arrays,string,C#,Arrays,String,我需要遍历一个字符串数组,并知道我以前是否见过一个特定的字符串值。通常,我会用其他语言写类似的东西: String oldValue=""; String newValue; for (i=0;i<myarray.Length;i++) { newValue=myarray[i]; if (oldValue==newValue) break; ... oldValue=newValue; } 字符串oldValue=”“; 字符串new
String oldValue="";
String newValue;
for (i=0;i<myarray.Length;i++)
{
newValue=myarray[i];
if (oldValue==newValue)
break;
...
oldValue=newValue;
}
字符串oldValue=”“;
字符串newValue;
对于(i=0;i我不确定是否理解您的问题,但如果您想要检测数组中重复的第一个字符串,则需要记住所有字符串。我建议使用哈希集,因此它至少以O(n)形式运行,如下所示:
HashSet<string> prevSet = new HashSet<string>();
foreach ( string str in myArray )
if ( !prevSet.Add(str) ) return str;
HashSet prevSet=new HashSet();
foreach(myArray中的字符串str)
如果(!prevSet.Add(str))返回str;
我不确定是否理解了您的问题,但如果您想要检测数组中重复的第一个字符串,则需要记住所有字符串。我建议使用哈希集,因此至少它以O(n)形式运行,如下所示:
HashSet<string> prevSet = new HashSet<string>();
foreach ( string str in myArray )
if ( !prevSet.Add(str) ) return str;
HashSet prevSet=new HashSet();
foreach(myArray中的字符串str)
如果(!prevSet.Add(str))返回str;
您可以这样做来列出词频:
var frequency =
myarray
.GroupBy(x => x)
.Select(x => new
{
Value = x.Key,
Count = x.Count(),
});
然后,您可以在Count>1
的位置筛选此列表。您可以这样做来创建词频列表:
var frequency =
myarray
.GroupBy(x => x)
.Select(x => new
{
Value = x.Key,
Count = x.Count(),
});
然后,您可以在Count>1
字符串不可变的情况下筛选此列表,但仍然可以将变量分配给新值。您是否可以发布一个完整的代码示例来演示您遇到的问题?(如果您有,请参考上面格兰特的评论;您在哪里分配了newValue
?显然这不是一个完整的程序;它不会按原样编译。)看起来你并没有真正尝试过这一点。抱歉,伙计们,我没有设置新值。我将其编辑为include.Hi Trebor--我想你误解了.net中不可变字符串的含义。你仍然可以为字符串变量分配新值--该变量不是只读的,也不是一次性初始化的。不可变性只是意味着1.E每当您为字符串变量指定一个新值时,就会在幕后分配一个新字符串,2.您不能只更改字符串中的一个字符,如newValue[2]='g';Chris和JMarsch,你们每个人都用我不理解的东西击中了它的头部。我在上一个任务中遇到了不变性问题,离开时认为它们是不可更改的,并且你不能给它们分配新的值。所以我写了一个演示,试图证明我认为是正确的,结果发现我完全是错的rong解释了这实际上是如何工作的。感谢您的澄清!字符串是不可变的,但您仍然可以将变量分配给新值。您能发布一个完整的代码示例来演示您遇到的问题吗?(如果您有,请参考上面格兰特的评论;您在哪里分配了newValue
?显然这不是一个完整的程序;它不会按原样编译。)看起来你并没有真正尝试过这一点。抱歉,伙计们,我没有设置新值。我将其编辑为include.Hi Trebor--我想你误解了.net中不可变字符串的含义。你仍然可以为字符串变量分配新值--该变量不是只读的,也不是一次性初始化的。不可变性只是意味着1.E每当您为字符串变量指定一个新值时,就会在幕后分配一个新字符串,2.您不能只更改字符串中的一个字符,如newValue[2]='g';Chris和JMarsch,你们每个人都用我不理解的东西击中了它的头部。我在上一个任务中遇到了不变性问题,离开时认为它们是不可更改的,并且你不能给它们分配新的值。所以我写了一个演示,试图证明我认为是正确的,结果发现我完全是错的这实际上是如何工作的。谢谢你的澄清!+1。你可以跳过包含,只要做如果(!prevSet.Add(str))return str;
请参见Danyluis,谢谢!您是正确的,我需要真正记住前面的所有值,这是一个比我想做的要好得多的解决方案。+1.您可以跳过Contains
,只需执行if(!prevSet.Add(str))return str;
请参阅Danyluis,谢谢!您说得对,我需要真正记住前面的所有值,这是一个比我想做的要好得多的解决方案。