我有一个包含名称的项目列表,我需要对其进行迭代,但是我还需要知道具有相同名称的该项目有多少次。因此,这是一个示例:
-----
|1|A|
|2|B|
|3|C|
|4|C|
|5|C|
|6|A|
|7|B|
|8|C|
|9|C|
-----
因此,当我进行迭代并且位于第1行时,我想知道这是第一次成为A
,而当我位于第6行时,我想知道它是第二次,当我进入第9行时,我想知道它是第五个C
,依此类推。如何实现呢?我可以追踪一些索引吗?我还考虑在迭代时填充哈希,但这也许太多了。
答案 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的扩展,具有附加的行为。如果有人认为这不是正确答案,请在评论中提及我。我将尝试澄清这个问题。