1

我有一个电子邮件文本文档,例如

Google12@gmail.com,
MyUSERNAME@me.com,
ME@you.com,
ratonabat@co.co,
iamcool@asd.com,
ratonabat@co.co,

我需要检查所述文档是否有重复项并从中创建一个唯一数组(因此,如果“ratonabat@co.co”在新数组中出现 500 次,他只会出现一次。)

编辑:例如:

username1@hotmail.com
username2@hotmail.com
username1@hotmail.com
username1@hotmail.com
username1@hotmail.com
username1@hotmail.com

这是我的“数据”(在数组或文本文档中,我可以处理)

我希望能够查看其中是否存在重复,并将重复的 ONCE 移动到另一个数组。所以输出将是

username1@hotmail.com
4

3 回答 3

10

您可以简单地使用 Linq 的Distinct扩展方法:

var input = new string[] { ... };
var output = input.Distinct().ToArray();

您可能还需要考虑重构代码以使用 aHashSet<string>而不是简单的数组,因为它可以优雅地处理重复项。


要获得一个仅包含那些重复记录的数组,这有点复杂,但您仍然可以使用一点 Linq 来完成:

var output = input.GroupBy(x => x)
                  .Where(g => g.Skip(1).Any())
                  .Select(g => g.Key)
                  .ToArray();

解释:

  • .GroupBy将相同的字符串组合在一起
  • .Where按以下条件过滤组
    • .Skip(1).Any()如果组中有 2 个或更多项目,则返回 true。这等价于.Count() > 1,但效率稍高一些,因为它在找到第二个项目后停止计数。
  • .Select返回仅由单个字符串组成的集合(而不是组)
  • .ToArray将结果集转换为数组。

这是使用自定义扩展方法的另一种解决方案:

public static class MyExtensions
{
    public static IEnumerable<T> Duplicates<T>(this IEnumerable<T> input)
    {
        var a = new HashSet<T>();
        var b = new HashSet<T>();
        foreach(var x in input)
        {
            if (!a.Add(x) && b.Add(x))
                yield return x;
        }
    }
}

然后你可以像这样调用这个方法:

var output = input.Duplicates().ToArray();

我没有对此进行基准测试,但它应该比以前的方法更有效。

于 2013-11-08T05:34:33.893 回答
3

您可以使用内置.Distinct()方法,默认情况下比较区分大小写,如果要使其不区分大小写,请使用带比较器的重载并使用不区分大小写的字符串比较器。

List<string> emailAddresses = GetListOfEmailAddresses();
string[] uniqueEmailAddresses = emailAddresses.Distinct(StringComparer.OrdinalIgnoreCase).ToArray();

编辑:现在我看到您在澄清后只想列出重复项。

string[] duplicateAddresses = emailAddresses.GroupBy(address => address,
                                                    (key, rows) => new {Key = key, Count = rows.Count()}, 
                                                    StringComparer.OrdinalIgnoreCase)
                                            .Where(row => row.Count > 1)
                                            .Select(row => row.Key)
                                            .ToArray();
于 2013-11-08T05:36:39.223 回答
1

选择出现多次的电子邮件..

var dupEmails=from emails in File.ReadAllText(path).Split(',').GroupBy(x=>x)
              where emails.Count()>1
              select emails.Key;
于 2013-11-08T05:35:29.963 回答