如何将一个值分配给 C# 字典中的多个键?
How to assign one value to multiple keys in a C# dictionary?
我想定义一个字母字典。在这本词典中,字符是键,并且为每个字符分配了一个值。
我用最简单的方式写了它,你可以看到一些键具有相同的值。
var testDict =
new Dictionary <char, int>() {
{'A', 1}, {'E', 1}, {'I', 1},
{'O', 1}, {'U', 1}, {'L', 1},
{'N', 1}, {'R', 1}, {'S', 1},
{'T', 1},
{'D', 2}, {'G', 2},
{'B', 3}, {'C', 3}, {'M', 3}, {'P', 3},
{'F', 4}, {'H', 4}, {'V', 4}, {'W', 4}, {'Y', 4},
{'K', 5},
{'J', 8}, {'X', 8},
{'Q',10}, {'Z',10}};
我需要在其中找到字母并使用分配的值。怎样才能写得更简洁?
使用此扩展方法:
public static void Add<TKey, TValue>(this Dictionary<TKey, TValue> dict, TValue value, params TKey[] keys)
{
foreach (var key in keys)
dict.Add(key, value);
}
您可以像这样创建字典:
var testDict =
new Dictionary<char, int>() {
{1, 'A', 'E', 'I'},
{2, 'D', 'G'},
{3, 'B', 'C', 'M', 'P'},
};
您可以创建键值字典。
然后,您可以使用 linq 将其转换为字典:
var tempDict = new Dictionary<int, List<char>>
{
{1, new List<char> {'A', 'E','I'}},
{2, new List<char> {'D','G'}}
};
var finalDict = new Dictionary<char, int>();
tempDict.ForEach(x => x.Value.ForEach(y => finalDict[y] = x.Key));
A Dictionary 是键和值的集合。在这个集合中,每个键只映射到一个值。并且已经在System.Collection.Generics命名空间中实现了。
另一方面,有一个名为 Lookup 的集合,它表示键和值之间的一对多映射。 IE。它将一个键映射到一个或多个值,并且它在 System.Linq 命名空间中。
您可以转换任何已实现 IEnumerable 接口和 System.Linq 命名空间中的 ToLookup() 方法的集合,以构造 Lookup< TKey, TElement> 集合.
在有关 C# 语言的 Microsoft 教程中阅读有关 Lookup collection and Dictionary 的更多信息。
在这个问题中,我们可以考虑一个由两个字段组成的包,一个句子中的“字母”字符及其“计数”。
class Package
{
public char Alphabet;
public int Counts;
}
然后构造Lookup数据结构:
public static void LookupExample()
{
// Create a dictionary of Packages to put into a Lookup data structure.
var testDict = new Dictionary <char, int>() {
new Package { Alphabet = 'A', Counts = 1},
new Package { Alphabet = 'B', Counts = 3},
new Package { Alphabet = 'C', Counts = 3},
new Package { Alphabet = 'D', Counts = 2},
new Package { Alphabet = 'E', Counts = 1},
new Package { Alphabet = 'F', Counts = 4},
new Package { Alphabet = 'G', Counts = 2},
new Package { Alphabet = 'H', Counts = 4},
new Package { Alphabet = 'I', Counts = 1},
new Package { Alphabet = 'J', Counts = 8},
new Package { Alphabet = 'K', Counts = 5},
new Package { Alphabet = 'L', Counts = 1},
new Package { Alphabet = 'M', Counts = 3},
new Package { Alphabet = 'N', Counts = 1},
new Package { Alphabet = 'O', Counts = 1},
new Package { Alphabet = 'P', Counts = 3},
new Package { Alphabet = 'Q', Counts = 10},
new Package { Alphabet = 'R', Counts = 1},
new Package { Alphabet = 'S', Counts = 1},
new Package { Alphabet = 'T', Counts = 1},
new Package { Alphabet = 'U', Counts = 1},
new Package { Alphabet = 'V', Counts = 4},
new Package { Alphabet = 'W', Counts = 4},
new Package { Alphabet = 'X', Counts = 8},
new Package { Alphabet = 'Y', Counts = 4},
new Package { Alphabet = 'Z', Counts = 10}};
// Create a Lookup to organize the packages. Use the Counts of each Alphabet as the key value.
// Select Alpahbet appended to each Counts in the Lookup.
Lookup<int, char> lookup = (Lookup<int, char>)testDict.ToLookup(p => p.Counts, p => p.Alphabet);
// Iterate through each IGrouping in the Lookup and output the contents.
foreach (IGrouping<int, char> packageGroup in lookup)
{
// Print the key value of the IGrouping.
Console.WriteLine(packageGroup.Key);
// Iterate through each value in the IGrouping and print its value.
foreach (char chr in packageGroup)
Console.WriteLine(" {0}", Convert.ToString(chr));
}
}
这有助于将“计数”视为新键并为其分配多个“字母”字符,这些字符的“计数”值具有相同的数量!
我想定义一个字母字典。在这本词典中,字符是键,并且为每个字符分配了一个值。 我用最简单的方式写了它,你可以看到一些键具有相同的值。
var testDict =
new Dictionary <char, int>() {
{'A', 1}, {'E', 1}, {'I', 1},
{'O', 1}, {'U', 1}, {'L', 1},
{'N', 1}, {'R', 1}, {'S', 1},
{'T', 1},
{'D', 2}, {'G', 2},
{'B', 3}, {'C', 3}, {'M', 3}, {'P', 3},
{'F', 4}, {'H', 4}, {'V', 4}, {'W', 4}, {'Y', 4},
{'K', 5},
{'J', 8}, {'X', 8},
{'Q',10}, {'Z',10}};
我需要在其中找到字母并使用分配的值。怎样才能写得更简洁?
使用此扩展方法:
public static void Add<TKey, TValue>(this Dictionary<TKey, TValue> dict, TValue value, params TKey[] keys)
{
foreach (var key in keys)
dict.Add(key, value);
}
您可以像这样创建字典:
var testDict =
new Dictionary<char, int>() {
{1, 'A', 'E', 'I'},
{2, 'D', 'G'},
{3, 'B', 'C', 'M', 'P'},
};
您可以创建键值字典。 然后,您可以使用 linq 将其转换为字典:
var tempDict = new Dictionary<int, List<char>>
{
{1, new List<char> {'A', 'E','I'}},
{2, new List<char> {'D','G'}}
};
var finalDict = new Dictionary<char, int>();
tempDict.ForEach(x => x.Value.ForEach(y => finalDict[y] = x.Key));
A Dictionary
另一方面,有一个名为 Lookup
您可以转换任何已实现 IEnumerable 接口和 System.Linq 命名空间中的 ToLookup() 方法的集合,以构造 Lookup< TKey, TElement> 集合.
在有关 C# 语言的 Microsoft 教程中阅读有关 Lookup collection and Dictionary 的更多信息。
在这个问题中,我们可以考虑一个由两个字段组成的包,一个句子中的“字母”字符及其“计数”。
class Package
{
public char Alphabet;
public int Counts;
}
然后构造Lookup数据结构:
public static void LookupExample()
{
// Create a dictionary of Packages to put into a Lookup data structure.
var testDict = new Dictionary <char, int>() {
new Package { Alphabet = 'A', Counts = 1},
new Package { Alphabet = 'B', Counts = 3},
new Package { Alphabet = 'C', Counts = 3},
new Package { Alphabet = 'D', Counts = 2},
new Package { Alphabet = 'E', Counts = 1},
new Package { Alphabet = 'F', Counts = 4},
new Package { Alphabet = 'G', Counts = 2},
new Package { Alphabet = 'H', Counts = 4},
new Package { Alphabet = 'I', Counts = 1},
new Package { Alphabet = 'J', Counts = 8},
new Package { Alphabet = 'K', Counts = 5},
new Package { Alphabet = 'L', Counts = 1},
new Package { Alphabet = 'M', Counts = 3},
new Package { Alphabet = 'N', Counts = 1},
new Package { Alphabet = 'O', Counts = 1},
new Package { Alphabet = 'P', Counts = 3},
new Package { Alphabet = 'Q', Counts = 10},
new Package { Alphabet = 'R', Counts = 1},
new Package { Alphabet = 'S', Counts = 1},
new Package { Alphabet = 'T', Counts = 1},
new Package { Alphabet = 'U', Counts = 1},
new Package { Alphabet = 'V', Counts = 4},
new Package { Alphabet = 'W', Counts = 4},
new Package { Alphabet = 'X', Counts = 8},
new Package { Alphabet = 'Y', Counts = 4},
new Package { Alphabet = 'Z', Counts = 10}};
// Create a Lookup to organize the packages. Use the Counts of each Alphabet as the key value.
// Select Alpahbet appended to each Counts in the Lookup.
Lookup<int, char> lookup = (Lookup<int, char>)testDict.ToLookup(p => p.Counts, p => p.Alphabet);
// Iterate through each IGrouping in the Lookup and output the contents.
foreach (IGrouping<int, char> packageGroup in lookup)
{
// Print the key value of the IGrouping.
Console.WriteLine(packageGroup.Key);
// Iterate through each value in the IGrouping and print its value.
foreach (char chr in packageGroup)
Console.WriteLine(" {0}", Convert.ToString(chr));
}
}
这有助于将“计数”视为新键并为其分配多个“字母”字符,这些字符的“计数”值具有相同的数量!