如何在字典中添加值为列表类的项?

时间:2017-01-06 07:27:29

标签: c# .net linq

我正在下面的字典:

Dictionary<string, List<Coordinates>> Coordinates = new Dictionary<string,List<Coordinates>>();

 public class Coordinates
    {
        public int Id { get; set; }
        public decimal range { get; set; }
        //other properties
    }

现在我正在尝试为我的字典添加坐标以获取特定的区域ID,如果相同的坐标ID出现,那么我不想添加它。

以下是我的网络服务方法:

public string MyMethod(string coordinateId, string regionId)
        { 
           var coordinates = Coordinates.Where(ed => (ed.Key == regionId)).SelectMany(ed => ed.Value).ToList();

           var coordinatesExist = coordinates.Any(ed => ed.Id.ToString() == id);
           if (!Coordinates.ContainsKey(regionId) && !coordinatesExist)
            {
                   //here i want to add it but as it is list of my class i dont know how to add it  
                   Coordinates.Add(regionId, ?????);
            }
            else
            {
               return "This coordinate id already exist for this region id";
            }
        }

我检查了以下链接,但这些答案是使用字符串列表或数组但不包含类列表:

c# dictionary How to add multiple values for single key?

How to add values to Dictionary with a list of dictionaries inside

示例数据

Region Id = 100
Coordinate Id = 10,20,30

Region Id = 200
Coordinate Id = 10,20,30
  • 第一次调用Mymethod,RegionId = 100,坐标id = 10,然后我想在我的字典中输入: Key = 100,value = 10
  • 第二次调用Mymethod,RegionId = 100,坐标id = 20,然后我想在我的字典中输入: Key = 100,value = 20
  • 第3次调用Mymethod,RegionId = 100,坐标id = 20,然后我想在我的字典中找到: 我不想添加此项,因为regionId = 100
  • 已经存在20个坐标ID

4 个答案:

答案 0 :(得分:1)

假设您的班级名称为Coordinate,而您的词典为Coordinates

基本上:

Coordinates.Add(
  new List<Coordinate>()
  { 
    new Coordinate()
    {
      Id = coordinateId
    }
  }
); //You can remove all the whitespaace

问题是这样的(由于您的代码检查字典中是否已存在密钥列表),您的列表中始终只有1个条目。

那么为什么不改变Dictionary<string, Coordinates>

以json的名义:

this is what you do:
{  "key" : [Coordinate] }

why not?
{  "key" : Coordinate }

Or are you trying to achieve? 
{  "key" : [Coordinate, Coordinate, Coordinate] }

回答更新

所以你这样做,想要晚些时候:{ "key" : [Coordinate, Coordinate, Coordinate] }

每个词典条目中都有一个List。如果字典是键和值的列表,则在1维中说字典中的列表是2维数组。

事情就在这里。您需要分两步进行分解:

  1. 检查字典中是否已存在regionId键(这意味着已经存在1个坐标(
  2. 如果不是:使用第一个坐标创建一个新列表。
  3. 如果是,请检查CoordinateId是否已存在,如果未将其添加到列表中。
  4. 解决方案

    public string MyMethod(string coordinateId, string regionId)
    {
        if (!Coordinates.ContainsKey(regionId))
        {
            oordinates.Add(regionId, new Coordinate() {Id = regionId});
        }
        else
        {
            //Get the list of coordinates out of the dictionary for its region
            var list = Coordinates[regionId];
            if(list.Any(cor=> cor.Id == coordinateId))
            {   //Check if any of the coordinates have the same Id
                return "This coordinate id already exist for this region id";
    
            } else
            {  //Otherwise we add it to the list.
                lists.Add(new Coordinate() { Id = regionId})
            }
    
        }
        return "added";
    }
    

答案 1 :(得分:1)

使用正确的数据结构Dictionary<string, HashSet<Coordinates>>Coordinates {{1}}方法,用于比较ID。

这样你就可以Add the Equals and GetHashCode只有在它不存在的情况下才会被添加。

答案 2 :(得分:0)

尝试这样的事情: Coordinates.Add(regionId, new List<Coordinates> { new Coordinates { Id = id, Range = ??? } });

答案 3 :(得分:0)

我认为你正在寻找这个:

Coordinates.Add(regionId, new List<Coordinates>()
                        {
                          new Coordinates(){Id=1,range=10},
                          new Coordinates(){Id=2,range=110},
                          new Coordinates(){Id=3,range=1140}
                       });

如果你想初始化这样的dictonary意味着你可以这样做:

Dictionary<string, List<Coordinates>> Coordinates = new Dictionary<string, List<Coordinates>>()
{ 
    {"ID1", new List<Coordinates>()
          {
            new Coordinates(){Id=1,range=10},
            new Coordinates(){Id=2,range=110},
            new Coordinates(){Id=3,range=1140}
          }
    },
    {"ID2", new List<Coordinates>()
          {
            new Coordinates(){Id=1,range=10},
            new Coordinates(){Id=2,range=110},
            new Coordinates(){Id=3,range=1140}
          }
    }
};