如何从IDictionary获取键值对?

时间:2016-01-06 13:27:07

标签: c#

我有一个jSon文件,其中包含一些像这样的值:

{AvailableWeapons:[ {"LevelNumber":1,"WeaponName":"Axe"},{"LevelNumber":5,"WeaponName":"WarHammer"} ]

使用miniJSon,我已将其解析为IDictionary,如下所示:

IDictionary weaponsGrid = JsonManager.instance.availableWeapons as IDictionary;

我在一个具有整数参数" level"的方法中访问它。该方法取参数,将其与每个levelnumber字段进行比较。如果level大于levelNumber,则相应的武器可用。

伪代码:

foreach levelNumber in weaponsGrid,
if currentLevel > levelNumber
 get name of weapon available at that level 

我怎样才能在C#中实现这一目标?感谢

6 个答案:

答案 0 :(得分:4)

使用linq:

DISTINCT

这将为您提供一个值列表,其中键大于X

答案 1 :(得分:2)

你可以做这样的事情

IDictionary<int, string> dict = new Dictionary<int, string> { { 1, "Axe" }, { 6, "WarHammer" }, { 2, "Knife" }, { 9, "Gun" } };

int level = 5; //input to method
List<string> powerfulWeapons = new List<string>(); //method output
foreach (var item in dict)
{
    if (item.Key > level)
        powerfulWeapons.Add(item.Value);
}
//powerfulWeapons = [ "WarHammer", "Gun" ]

或者,使用Linq

var weapons = weaponsGrid.Where(w => w.Key > 5).Select(d => d.Value);

如果您只想要一个

string firstHeavyWeapon = string.Empty;
var firstHeavyWeaponEntry = weaponsGrid.FirstOrDefault(w => w.Key > 5);
if (!firstHeavyWeaponEntry.Equals(new KeyValuePair<int, string>()))
    firstHeavyWeapon = firstHeavyWeaponEntry.Value;

根据评论中的建议,如果您希望第一个(最小)Key符合条件,则可以执行此操作

var firstHeavyWeaponEntry = weaponsGrid
                                .OrderBy(w => w.Key)
                                .FirstOrDefault(w => w.Key > 5);

答案 2 :(得分:1)

$.viewMap = {
  '0': $([]),
  'view1': $('#view1'),
  'view2': $('#view2a, #view2b'),
  'view3': $('#view3')
};
$('#viewSelector').change(function() {
  // hide all
  $(".views").hide();
  // show current
  $.viewMap[$(this).val()].show();
});

答案 3 :(得分:1)

然后使用Keys属性,如

foreach(var levelNumber in weaponsGrid.Keys)
{
   // your code here    
}

您可以使用密钥

访问该值
weaponsGrid[levelNumber]

考虑到您已设置词典

        IDictionary<int, string> weaponsGrid = new Dictionary<int, string> 
        { 
        { 1, "Axe" }, 
        { 6, "WarHammer" }, 
        { 2, "Knife" }, 
        { 9, "Gun" } 
        };

你可以检查一个密钥是否存在,然后得到它的值,如

        string weapon = weaponsGrid.ContainsKey(6) ? weaponsGrid[6] : string.Empty;

或者,获取所有值

        foreach (var item in weaponsGrid.Values)
        {
            Console.WriteLine(item);

        }

答案 4 :(得分:1)

使用KeyValuePair

foreach (KeyValuePair<Int32,string> weapen in weaponsGrid )
  {
    if(weapen.key > value)
    {
            var weapenName = weapen.Value
    }

  }

答案 5 :(得分:0)

您可以使用IDictionary.Keys属性访问字典中的键,该属性会返回ICollection个键。对于您的示例,您可以执行以下操作:

foreach (var levelNumber in weaponsGrid.Keys)
{
    if (currentLevel > levelNumber)
    {
        var weaponName = weaponsGrid[levelNumber].Name;
    }
}