【问题标题】:Loop through an array of strings and compare to previous values循环遍历字符串数组并与之前的值进行比较
【发布时间】:2014-03-02 01:59:47
【问题描述】:

我需要遍历一个字符串数组,并知道我以前是否见过一个特定的字符串值。通常,我会用其他语言写这样的东西:

String oldValue="";
String newValue;
for (i=0;i<myarray.Length;i++)
{
    newValue=myarray[i];
    if (oldValue==newValue)
        break;
    ...

    oldValue=newValue;

}

但是,这在 C# 中不起作用,因为字符串是不可变的。如果我只是替换整个字符串,看起来我可以使用正则表达式来做到这一点,但这似乎是额外的开销。以前其他人是如何处理的?

谢谢

【问题讨论】:

  • 字符串是不可变的,但您仍然可以将变量分配给新值。您可以发布一个完整的代码示例来演示您遇到的问题吗? (如果有,请参阅上面格兰特的评论;你在哪里分配了newValue?显然这不是一个完整的程序;它不会按原样编译。)
  • 看起来你并没有真正尝试过
  • 对不起,我错过了设置 newValue。我已经对其进行了编辑以包括在内。
  • 嗨 Trebor——我认为你误解了 .net 中不可变字符串的含义。您仍然可以为字符串变量分配新值——该变量不是只读的,也不是初始化一次。不变性只是意味着 1. 每次为字符串变量分配新值时,都会在后台分配一个新字符串,以及 2. 您不能只更改字符串的一个字符,例如 newValue[2] = ' g';
  • Chris 和 JMarsch,你们每个人都用我不理解的东西击中了它的头。我在之前的任务中遇到了不变性问题,并认为它们是不可更改的,并且您无法为它们分配新值。所以我写了一个演示只是为了尝试证明我认为是真的,然后发现我完全错误地认为它实际上是如何工作的。感谢您的澄清!

标签: c# arrays string


【解决方案1】:

我不确定我是否理解您的问题,但如果您打算检测数组中重复的第一个字符串,您需要记住所有这些字符串。我建议使用 HashSet,所以至少它在 O(n) 中运行,像这样:

HashSet<string> prevSet = new HashSet<string>();

foreach ( string str in myArray )
  if ( !prevSet.Add(str) ) return str;

【讨论】:

  • +1。你可以跳过Contains 直接做if (!prevSet.Add(str)) return str;HashSet.Add
  • 丹尼路斯,谢谢!你说得对,我需要真正记住以前的所有价值观,这比我想的要好得多。
【解决方案2】:

您可以这样做来制作词频列表:

var frequency =
    myarray
        .GroupBy(x => x)
        .Select(x => new
        {
            Value = x.Key,
            Count = x.Count(),
        });

然后您可以只过滤Count &gt; 1 的列表。

【讨论】:

    猜你喜欢
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多