根据键排序两个字典

时间:2019-07-30 10:43:04

标签: c# .net list linq dictionary

我有两个具有相同键的字典。 第一个包含对特定键的计数,第二个则类似于查找,它包含特定键的实际“值”。

这里是一个例子:

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

2 个答案:

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

DEMO