我有一个使用字典来存储"key=value“对的需求,但是现在我需要存储”重复的“键值。
我有一行分隔的文本(用竖线字符("|")分隔),我将其拆分成一个数组,然后放入一个字典(如下所示)
string[] t = rawMessage.Split(new[] { '|', '|' }, StringSplitOptions.RemoveEmptyEntries);
message = t.ToDictionary(s => s.Split('=')[0], s => s.Split('=')[1]);
如果不存在重复的键,但我想以一种在插入前调整键值的方式来存储重复的键,则可以很好地执行此操作。
示例
A=1|B=2|C=3|D=4|D=5|D=5
我希望将键值调整为类似以下内容:
A=1
B=2
C=3
D=4
D[1]=5
D[2]=5
因此,我可以拉出第二个和第三个"D“条目的条目,因为它们具有新的键值。
每个副本都是一个唯一的记录,因此我希望能够按照它们输入的顺序进行引用。例如,第四个条目将是D4。建议对所有值使用相同的键值,可能/将会令人困惑,我可能最终会提取错误的信息(但会记住这一点)。
我希望避免事先遍历数组,并且想知道是否有人知道我可以在上面代码的ToDictionary部分执行此操作的方法。
对于相当基本的解释,我深表歉意。许多线程都在处理删除字典中的重复项,我知道这不是字典的预期用途。
发布于 2017-02-21 23:45:08
如果您想要将多个值与一个键相关联,您可以只将该值对的一部分作为列表:
var dict = new Dictionary<char, List<int>>();
char key = 'D';
int value = 5;
if (!dict.ContainsKey(key))
dict[key] = new List<int>();
dict[key].Add(value);
发布于 2017-02-22 00:03:04
您可以使用GroupBy
按键对结果集进行分组,然后使用SelectMany,
使用Select
方法overload with index参数投影所需的键来展平分组:
var message = t
.Select(s => s.Split('='))
.GroupBy(s => s[0], s => s[1])
.SelectMany(g => g.Select((v, i) => new
{
Key = i == 0 ? g.Key : g.Key + "[" + i + "]",
Value = v
}))
.ToDictionary(e => e.Key, e => e.Value);
发布于 2017-02-21 23:50:39
您可以使用带有基于集合的值的字典:
Dictionary<string, List<int>>
然后,您可以为所需的作业使用最好的数据结构,但List<>
是一个很好的默认设置。
或者,您可以使用Lookup<TKey, TElement>
类,但这不会给出值元素的数组索引:
Lookup<string, int>
它支持键下的分组(因此是TElement
的枚举)。它的文档是here。
或者,使用您自己的数据结构,但这不太可能是必需的-现有事物的组合可能对您来说足够好。
https://stackoverflow.com/questions/42371764
复制相似问题