我有两个具有相同键的字典。 第一个包含对特定键的计数,第二个则类似于查找,它包含特定键的实际“值”。
这里是一个例子:
1。 dict:
Key: Value:
0; 10
1; 17
2; 3
3; 28
4; 8
2。 dict:
Key: Value:
0; String1
1; String2
2; String3
3; String4
4; String5
现在,我需要按1.字典的值对这些字典进行排序。我知道如何只订购第一个字典,但是我不知道如何为第二个字典进行订购。
预期输出为:
1。 dict:
Key: Value:
0; 28
1; 17
2; 10
3; 8
4; 3
2。 dict:
Key: Value:
0; String4
1; String2
2; String1
3; String5
4; String3
答案 0 :(得分:1)
好吧,字典(像这样)
var dict1 = new Dictionary<int, int>() {
{0, 10},
{1, 17},
{2, 3},
{3, 28},
{4, 8},
};
var dict2 = new Dictionary<int, string>() {
{0, "String 1"},
{1, "String 2"},
{2, "String 3"},
{3, "String 4"},
{4, "String 5"},
};
没有任何订单。但是,我们可以表示(借助 Linq )排序的数据:
// Just an OrderBy...
var result1 = dict1
.OrderByDescending(pair => pair.Value);
// It may appear, that dict1 doesn't have corresponding value
// that's why we have to introduce "found" variable
var result2 = dict2
.Select(pair => {
bool found = dict1.TryGetValue(pair.Key, out var value);
return new {
pair,
found,
value
};
})
.OrderByDescending(item => item.found)
.ThenByDescending(item => item.value)
.Select(item => item.pair);
Console.WriteLine(string.Join(Environment.NewLine, result1);
Console.WriteLine();
Console.WriteLine(string.Join(Environment.NewLine, result2);
结果:
[3, 28]
[1, 17]
[0, 10]
[4, 8]
[2, 3]
[3, String 4]
[1, String 2]
[0, String 1]
[4, String 5]
[2, String 3]
如果您只想枚举Value
s(没有Key
s),我们可以再添加一个Select
:
.Select((pair, i) => $"{i + 1}; {pair.Value}");
赞:
var result1 = dict1
.OrderByDescending(pair => pair.Value)
.Select((pair, i) => $"{i + 1}; {pair.Value}");
var result2 = dict2
.Select(pair => {
bool found = dict1.TryGetValue(pair.Key, out var value);
return new {
pair,
found,
value
};
})
.OrderByDescending(item => item.found)
.ThenByDescending(item => item.value)
.Select(item => item.pair)
.Select((pair, i) => $"{i + 1}; {pair.Value}");
结果:
1; 28
2; 17
3; 10
4; 8
5; 3
1; String 4
2; String 2
3; String 1
4; String 5
5; String 3
答案 1 :(得分:0)
如果key
对于具有相同序列的两个字典都相同,则这将是设计。
将两个字典组合成一个字典并对其排序,然后在其上生成序列号。
var dict1 = new Dictionary<int, String>();
dict1.Add(10, "string1");
dict1.Add(17, "string2");
dict1.Add(3, "string3");
dict1.Add(28, "string4");
dict1.Add(8, "string5");
var dict2 = new Dictionary<int, String>();
int i = 0;
foreach (KeyValuePair<int, string> author in dict1.OrderByDescending(key => key.Key))
{
dict2.Add(i, author.Value);
i++;
}
foreach (KeyValuePair<int, string> author in dict2)
{
Console.WriteLine("Key: {0}, Value: {1}", author.Key, author.Value);
}