【问题标题】:Removing strings with duplicate letters from string array从字符串数组中删除具有重复字母的字符串
【发布时间】:2020-06-25 12:56:02
【问题描述】:

我有类似的字符串数组

string[] A = { "abc", "cccc", "fgaeg", "def" };

我想获得一个字符串列表或数组,其中任何字母只出现一次。我的意思是“cccc”、“fgaeg”将从输入数组中删除。 我设法做到了,但我觉得我的方式非常混乱,不必要地复杂且效率不高。

你有什么想法来改进这个算法(可能只用一个 Linq 查询替换)?

我的代码:

        var goodStrings = new List<string>();
        int i = 0;
        foreach (var str in A)
        {
            var tempArr = str.GroupBy(x => x)
                .Select(x => new
                {
                    Cnt = x.Count(),
                    Str = x.Key
                }).ToArray();

            var resultArr = tempArr.Where(g => g.Cnt > 1).Select(f => f.Str).ToArray();
            if(resultArr.Length==0) goodStrings.Add(A[i]);
            
            i++;
        }

【问题讨论】:

  • 我认为,可以使用正则表达式进行检查,例如 ".*(\w).*\1.*"

标签: c# arrays string linq


【解决方案1】:

您可以对每个数组项使用Distinct 方法,并获取不同项的计数等于原始字符串长度的项

string[] A = { "abc", "cccc", "fgaeg", "def" };
var result = A.Where(a => a.Distinct().Count() == a.Length).ToList();

正如预期的那样,您将获得包含 abcdef 值的列表

【讨论】:

  • 非常好的方法。我没有想到。简单干净。
  • 此外,如果字符串足够长,那么删除 bat 右侧超过 26 个字符的所有字符串可能是值得的。
  • @Franck 谢谢,这很好。但是,OP 没有提到这样的要求,比如字符串长度或使用的字母
猜你喜欢
  • 1970-01-01
  • 2017-03-11
  • 2012-05-09
  • 2018-06-09
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2015-09-08
  • 2021-06-05
相关资源
最近更新 更多