在List <string> </string>中查找重复项

时间:2011-09-27 10:01:59

标签: c# .net list

在包含数十万个条目的列表中,如何将每个条目与列表的其余部分进行比较以进行重复? 例如,List fileNames包含“00012345.pdf”和“12345.pdf”,并被视为duplicte。标记此类副本的最佳策略是什么?

由于

更新:文件的命名仅限于数字。它们用零填充。重复是缺少填充的地方。因此,“123.pdf”&amp; “000123.pdf”是重复的。

4 个答案:

答案 0 :(得分:4)

您可能希望实现自己的子字符串比较器,以根据子字符串是否包含在另一个字符串中来测试相等性。

这不一定是优化的,但它会起作用。如果您使用的是.NET 4.0,也可以考虑使用Parallel Linq。

编辑:更新后回复以反映编辑后的精炼问题

void Main()
{
    List<string> stringList = new List<string> { "00012345.pdf","12345.pdf","notaduplicate.jpg","3453456363234.jpg"};

    IEqualityComparer<string> comparer = new NumericFilenameEqualityComparer ();

    var duplicates = stringList.GroupBy (s => s, comparer).Where(grp => grp.Count() > 1);

    // do something with grouped duplicates...

}

// Not safe for null's !
// NB do you own parameter / null checks / string-case options etc !
public class NumericFilenameEqualityComparer : IEqualityComparer<string> {

   private static Regex digitFilenameRegex = new Regex(@"\d+", RegexOptions.Compiled);

   public bool Equals(string left, string right) {

        Match leftDigitsMatch = digitFilenameRegex.Match(left);
        Match rightDigitsMatch = digitFilenameRegex.Match(right);

        long leftValue = leftDigitsMatch.Success ? long.Parse(leftDigitsMatch.Value) : long.MaxValue;
        long rightValue = rightDigitsMatch.Success ? long.Parse(rightDigitsMatch.Value) : long.MaxValue;

        return leftValue == rightValue;
   }

   public int GetHashCode(string value) {
        return base.GetHashCode();
   }

}

答案 1 :(得分:1)

我知道您正在寻找重复项以便将其删除?

可以采用以下方法:

创建一个负责复制规则的类MyString。也就是说,覆盖EqualsGetHashCode以重新创建您正在考虑的重复规则。 (我从你的问题中了解 00012345.pdf 12345.pdf 应该被视为重复?)

明确地或明确地将此类转换为string(或覆盖ToString())。

创建一个HashCode<MyString>,并在原始List<String>检查重复项时重复填写。

可能很脏,但它会起作用。这里唯一的“硬”部分是正确实施复制规则。

答案 2 :(得分:0)

我有一个简单的解决方案,每个人都可以找到重复的字符串单词和汉字 对于文字

public class Test { 
    public static void main(String[] args) {
        findDuplicateWords("i am am a a learner learner learner");
    }
    private static void findDuplicateWords(String string) {
        HashMap<String,Integer> hm=new HashMap<>();
        String[] s=string.split(" ");
        for(String tempString:s){
            if(hm.get(tempString)!=null){
                hm.put(tempString, hm.get(tempString)+1);
            }
            else{
            hm.put(tempString,1);
        }
        }
        System.out.println(hm);
    }
}

用于循环字符,获取数组长度并使用charAt()

答案 3 :(得分:-1)

也许是这样的:

List<string> theList = new List<string>() { "00012345.pdf", "00012345.pdf", "12345.pdf", "1234567.pdf", "12.pdf" };

theList.GroupBy(txt => txt)
        .Where(grouping => grouping.Count() > 1)
        .ToList()
        .ForEach(groupItem => Console.WriteLine("{0} duplicated {1} times with these     values {2}",
                                                 groupItem.Key,
                                                 groupItem.Count(),
                                                 string.Join(" ", groupItem.ToArray())));