迭代列表并根据项目名称保留索引

时间:2018-08-27 05:19:20

标签: c#

我有一个包含名称的项目列表,我需要对其进行迭代,但是我还需要知道具有相同名称的该项目有多少次。因此,这是一个示例:

-----
|1|A|
|2|B| 
|3|C| 
|4|C| 
|5|C| 
|6|A| 
|7|B| 
|8|C| 
|9|C|
-----

因此,当我进行迭代并且位于第1行时,我想知道这是第一次成为A,而当我位于第6行时,我想知道它是第二次,当我进入第9行时,我想知道它是第五个C,依此类推。如何实现呢?我可以追踪一些索引吗?我还考虑在迭代时填充哈希,但这也许太多了。

4 个答案:

答案 0 :(得分:1)

您可以使用Dictionary<char, int>来保持列表中每个字符的计数

此处的键将是字符,值将包含列表中该字符的出现次数

    Dictionary<char, int> occurances = new Dictionary<char, int>();
    List<char> elements = new List<char>{'A', 'B','C','C','C','A','B', 'C', 'C'};
    int result = 0;
    foreach(char element in elements)
    {
        if(occurances.TryGetValue(element, out result))
            occurances[element] = result + 1;
        else
            occurances.Add(element, 1);
    }

    foreach(KeyValuePair<char, int> kv in occurances)
        Console.WriteLine("Key: "+ kv.Key + " Value: "+kv.Value);

输出:

Key: A Value: 2
Key: B Value: 2
Key: C Value: 5

POC:dotNetFiddler

答案 1 :(得分:1)

使用字典来跟踪计数器。

List<string> input = new List<string> { "A", "B", "C", "C", "C", "A", "B", "C", "C" };

            Dictionary<string, int> output = new Dictionary<string, int>();
            foreach(var item in input)
            {
                if (output.ContainsKey(item))
                {
                    output[item] = output[item] + 1;
                }
                else
                {
                    output.Add(item, 1);
                }
            }

答案 2 :(得分:0)

我认为您需要一个反向索引,而不是行存储索引。

行存储索引(如表中所述)和反向索引存储术语以搜索索引。 大概是这样的:

1,6

B 2,7

C 3,4,5,8,9

诸如“弹性搜索/ Solr”之类的搜索引擎将存储这样的字词。

如果您使用的是C#,jmeter.propertise对您非常有用。在那里,您可以保留反向索引的数据。

答案 3 :(得分:-1)

干净的方法是实现自己的列表;该项目是您自己的对象。通过此方法,您可以在对象中使用附加属性以及自己的Add()方法来实现自己的Iterator模式。新的Iterator应该继承List并且应该重写List的Add()方法。 我自己实现。您可以使用它。请记住,此解决方案是现有的一些解决方案之一。但是,我认为这是针对SOLID和OO主体的最佳解决方案之一。

public class CounterIterator : List<Item>
{
    public new void Add(Item item)
    {
        base.Add(item);
        foreach (var listItem in this)
        {
            if (listItem.Equals(item))
            {
                item.CountRepeat++;
            }
        }
    }
}

public class Item
{
    public Item(string value)
    {
        Value = value;
    }
    public string Value { get; private set; }
    public int CountRepeat { get; set; }
    public override bool Equals(object obj)
    {
        var item = obj as Item;
        return item != null && Value.Equals(item.Value);
    }
}

我测试了上面的代码。它是List的扩展,具有附加的行为。如果有人认为这不是正确答案,请在评论中提及我。我将尝试澄清这个问题。