2

我有大量字符串,包括许多重复项。重要的是所有副本都具有相同的大小写。所以这个集合将无法通过测试:

String[] strings = new String[] { "a", "A", "b", "C", "b" };

....但是这个测试会通过:

String[] strings = new String[] { "A", "A", "b", "C", "b" };

当我遍历 中的每个字符串时strings,我的程序如何才能看到它A是不区分大小写的副本a(因此失败),但允许副本b通过?

4

3 回答 3

3

一种简单的方法是创建两组- 一组使用不区分大小写的字符串比较器,另一组使用区分大小写的比较器。(我不清楚你是否想要一个文化敏感的字符串,或者在哪种文化中。)

Count构造后,如果两个集合的大小不同(

所以像:

public static bool AllDuplicatesSameCase(IEnumerable<string> input)
{
    var sensitive = new HashSet<String>(input, StringComparer.InvariantCulture);
    var insensitive = new HashSet<String>(input, 
          StringComparer.InvariantCultureIgnoreCase);
    return sensitive.Count == insensitive.Count;
}
于 2013-04-29T05:49:24.613 回答
0

还有另一个使用 LINQ 的选项。

                    //Group strings without considering case
bool doesListPass = strings.GroupBy(s => s.ToUpper())
                    //Check that all strings in each group has the same case
                    .All(group => group.All(s => group.First() == s));

                    //Group strings without considering case
IEnumerable<string> cleanedList = strings.GroupBy(s => s.ToUpper())
                    //Check that all strings in each group has the same case
                    .Where(group => group.All(s => group.First() == s))
                    //Map all the "passing" groups to a list of strings 
                    .SelectMany(g => g.ToList());

注意:您可以根据需要使用 ToUpper() 或 ToUpperInvariant()。

于 2013-04-29T06:51:35.337 回答
0

您可以明确检查每个条目。

static bool DuplicatesHaveSameCasing(string[] strings)
{
  for (int i = 0; i < strings.Length; ++i)
  {
    for (int j = i + 1; j < strings.Length; ++j)
    {
      if (string.Equals(strings[i], strings[j], StringComparison.OrdinalIgnoreCase)
        && strings[i] != strings[j])
      {
        return false;
      }
    }
  }
  return true;
}

评论:我选择使用序数比较。请注意,!=运算符使用序号和区分大小写的比较。将其更改为一些与文化相关的比较是相当微不足道的。

于 2013-04-29T06:19:16.880 回答