根据C#中的子字符串获取唯一字符串

时间:2013-07-21 05:39:55

标签: c# string algorithm data-structures unique

我有一个包含近100000个条目的文本文件。所有这些都处于某种模式,如
word1 word2 word3 word4

然而,在所有单词相同的情况下,这些条目中的一些是重复的。当我尝试读取并形成一个唯一的数组或列表时,我使用中间哈希集来执行此操作。而且效果很好。
但基本上我想要实现的只是word2的唯一条目。如果word2是常见的而且所有其他的都不同,我想保留任何一个条目 e.g
cat dog lion tiger
cat dog deer bear
mouse rat bear deer
lion tiger cat dog
cat dog deer bear

在这种情况下,所需的输出是:
cat dog lion tiger
mouse rat bear deer
lion tiger cat dog


cat dog deer bear
mouse rat bear deer
lion tiger cat dog

目前哈希集给出的是:

cat dog lion tiger
cat dog deer bear
mouse rat bear deer
lion tiger cat dog

如果数据集很大,有关如何有效实现这一建议的任何建议。在这里使用正则表达式是唯一的选择吗?我正在使用C#。

2 个答案:

答案 0 :(得分:1)

查看数据并将第二个单词放入字典中以了解它是否出现过。 代码示例:

    string[] file = {   "cat dog lion tiger",
                    "cat dog deer bear",
                    "mouse rat bear deer",
                    "lion tiger cat dog",
                    "cat dog deer bear"};

    Dictionary<string, string> dict = new Dictionary<string, string>();

    List<string> lst = new List<string>();

    foreach (string s in file)
    {
        string[] words = s.Split(' ');
        // assumption - thare are at least 2 words in a line - validate it
        if (!dict.ContainsKey(words[1]))
        {
            lst.Add(s);
            dict.Add(words[1], words[1]);
        }
    }

    foreach (string s1 in lst)
        Console.WriteLine(s1);

答案 1 :(得分:0)

您可以创建一个辅助类来存储字符串并将接口IEqualityComparer实现为HashSet,

示例:

        HashSet<WordsRow> list = new HashSet<WordsRow>(new WordsRow());

        list.Add(new WordsRow("cat dog lion tiger"));
        list.Add(new WordsRow("cat dog deer bear"));
        list.Add(new WordsRow("mouse rat bear deer"));
        list.Add(new WordsRow("lion tiger cat dog"));
        list.Add(new WordsRow("cat dog deer bear"));


        foreach (WordsRow row in list)
        {
            Console.WriteLine(row.Row);
        }

“WordRow类”必须包含以下::

public class WordsRow : IEqualityComparer<WordsRow>
{
    public string Row {get; set;}

    public WordsRow() { }

    public WordsRow(string row)
    {
        this.Row = row;                        
    }

    public bool Equals(WordsRow x, WordsRow y)
    {
        return x.Row.Split(' ')[1] == y.Row.Split(' ')[1];
    }

    public int GetHashCode(WordsRow obj)
    {
        return obj.Row.Split(' ')[1].GetHashCode();
    }
}