Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 迭代列表并根据项目名称保留索引_C# - Fatal编程技术网

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

C# 迭代列表并根据项目名称保留索引,c#,C#,我有一个有名称的项目列表,我需要迭代它们,但我还需要知道这个项目有多少次使用相同的名称。这是一个例子: ----- |1|A| |2|B| |3|C| |4|C| |5|C| |6|A| |7|B| |8|C| |9|C| ----- 所以,当我在第1行进行迭代时,我想知道这是第一次它是A,当我在第6行时,我想知道这是第二次,当我在第9行时,我想知道它是第5个C,等等。我怎样才能做到这一点?有什么索引我可以跟踪吗?我还想在迭代时填充一个散列,但这可能太多了。您可以使用字典对列表中

我有一个有名称的项目列表,我需要迭代它们,但我还需要知道这个项目有多少次使用相同的名称。这是一个例子:

-----
|1|A|
|2|B| 
|3|C| 
|4|C| 
|5|C| 
|6|A| 
|7|B| 
|8|C| 
|9|C|
-----
所以,当我在第1行进行迭代时,我想知道这是第一次它是A,当我在第6行时,我想知道这是第二次,当我在第9行时,我想知道它是第5个C,等等。我怎样才能做到这一点?有什么索引我可以跟踪吗?我还想在迭代时填充一个散列,但这可能太多了。

您可以使用字典对列表中的每个字符进行计数

在这里,键将是字符,值将包含该字符在列表中出现的次数

    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);

POC:

使用字典跟踪计数器

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);
                }
            }
我认为您需要一个反向索引,而不是行存储索引

行存储索引就像您描述的表一样,并反转索引存储项来搜索索引。 可能是这样的:

A 1,6

B 2,7

C 3,4,5,8,9

像“弹性搜索/Solr”这样的搜索引擎将存储这样的术语


若你们是C语言的,那个么字典对你们很有帮助。在那里,您可以保留反向索引的数据。

干净的方法是实现您自己的列表;项目是您自己的对象。通过此方法,您可以在对象和自己的Add方法中使用附加属性实现自己的迭代器模式。新的迭代器应该继承List并重写List的Add方法。 我自己实现这个。你可以用它。请记住,此解决方案是现有的一些解决方案之一。然而,我认为这是关于实体和面向对象原则的最佳解决方案之一

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);
    }
}

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

这感觉像是一个XY问题-。如果您的输入是问题中所示的一组字母,您希望得到什么结果?e、 你想数一数每封信吗?每个字母的第一个索引?每个字母的所有索引?还有什么?当迭代时,我想知道它是第三个C,所以我知道我需要从另一个列表中获取第三个C,而不是第一个或第二个。如果你能提供一个C,我们就可以看到其他列表的内容,那将是非常棒的。这可能有助于我们为您的上下文找到更好的解决方案。如果您只想按组计数项目,那么您可以使用Linq for itThanks@AmitKumar,这是我可以使用的东西,可能值得一读。
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);
    }
}