【问题标题】:Joining Dictionary key that matches class List's list item into a new list - C#将与类 List 的列表项匹配的字典键加入新列表 - C#
【发布时间】:2016-09-30 15:53:03
【问题描述】:

所以我有一个Dictionary,将字符串值作为键。我有一个班级列表:

listCoord = new List<Coord>();

Coord 的类看起来像:

class Coord
{
    public string Segment { get; set; }
    public double startX { get; set; }
    public double startY { get; set; }
    public double endX { get; set; }
    public double endY { get; set; }
}

它有大约 12000 个 string Segment 。我的字典的Keys 就是其中的一部分。现在我需要将字典中的段与List 中的坐标值连接起来。

起初我采用了使用foreach 的方法,并通过每个字典键将其与列表段进行比较以找到匹配项。然后我了解到 LINQ 可以使用 SQL 的内部连接来做同样的事情。

问题:

  1. 在字典键和特定列表项之间找到匹配项的最佳方法是什么?
  2. 完成后,如何将其全部放入另一个列表中,该列表包含匹配的segment 及其对应的startX, startY, endX, endY 值作为列表项。?

如果已经提出并回答了此类问题,我提前道歉;个人没找到。

【问题讨论】:

  • 你的字典是什么样子的?

标签: c# linq list dictionary


【解决方案1】:

这是加入列表和字典的方式(你只会得到匹配的坐标)

 List<CoordNew> newlist = listCoord .Join(strDictionary, 
                                 a => a.Segment, //From listCoord
                                 b => b.Key, //From strDictionary
                                 (a, b) => new CoordNew() { 
                                      Segment_dictionaryValue = b.Value
                                      //Other values from list or dictionary
                                 }).ToList();

如果你需要CoordNew作为

class CoordNew
{
    public string Segment { get; set; }
    public string Segment_dictionaryValue { get; set; }
    public double startX { get; set; }
    public double startY { get; set; }
    public double endX { get; set; }
    public double endY { get; set; }
}

【讨论】:

  • 也证实了这个工作,但我会选择 Eldho 的答案,更少的代码。虽然我需要在另一段代码中使用这个 Join 示例,所以谢谢你:)
  • 谢谢@Romy。我的回答和@Eldho 有区别。他的解决方案中的result 没有为您提供段“A”的字典值。但是,您可能不需要它,然后按照上面的 (@Eldho's) 进行操作,这对于过滤列表来说是简短而完美的。
【解决方案2】:

你也可以试试这个

    var listCoord = new List<Coord>();

    Dictionary<String, string> dict = new Dictionary<string, string>();
    dict.Add("A", "Myvalues");


    listCoord.Add(new Coord
    {
            Segment = "A",
    });

    listCoord.Add(new Coord
    {
      Segment = "B",
    });

    listCoord.Add(new Coord
    {
       Segment = "C",
    });

    List<Coord> result = listCoord.Where(cords => dict.ContainsKey(cords.Segment))
                         .ToList();

根据您的要求使用ContainsKey 和/或ContainsValues

dotnetfiddle 提供示例工作

感谢@Yacoub Massad 的收获

【讨论】:

  • 这行得通。最后一条语句成功了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2014-10-03
  • 1970-01-01
相关资源
最近更新 更多