Linq Groupby返回原始对象

Tre*_*ers 4 c# linq group-by

我需要一些帮助来过滤一些数据.我有一个具有三个属性的对象类.我得到的对象集合可以与第一个属性Point3d进行许多匹配.从该匹配集合中,我需要查看第二个属性是否具有唯一值Tag.最后,我需要能够识别Point3d匹配的对象,并且标签是不同的,使用第三个属性,它是Id(它始终是唯一的).

class pmatch
{
    public string Point3d { get; set; }
    public string Tag { get; set; }
    public string Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的一个例子是:

List<pmatch> dataset = new List<pmatch>
{
    new pmatch { Point3d = "1, 1, 1", Tag = "5", Id = "123" },
    new pmatch { Point3d = "1, 1, 1", Tag = "6", Id = "124" },
    new pmatch { Point3d = "1, 1, 2", Tag = "7", Id = "125" },
    new pmatch { Point3d = "1, 1, 2", Tag = "7", Id = "126" }
};
Run Code Online (Sandbox Code Playgroud)

我需要能够识别Id的123和124,因为他们的Point3ds匹配,但他们的标签没有.我已经能够使用LINQ识别这些实例:

var result = datalist.GroupBy(item => item.Point3d, item => item.Tag);
foreach (var group in result)
{
    Console.WriteLine(group.Key);
    var uniqueTags = group.Distinct().ToList();
    if (uniqueTags.Count > 1)
    {
        Console.WriteLine("Found mismatched tags");
        foreach (string Tag in group)
        {
            Console.WriteLine("  {0}", Tag);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这些结果并没有给我Id,所以我无法访问我发现的对象.如何将这些结果与Id或pmatch对象本身一起获得?

Ous*_* D. 5

您可以像这样完成所需的结果:

var resultSet = 
       dataset.GroupBy(item => item.Point3d)
              .Where(group => group.Select(item => item.Tag)
                                   .Distinct()
                                   .Count() > 1)
              .ToDictionary(item => item.Key, item => item.ToList());
Run Code Online (Sandbox Code Playgroud)

这将识别Id 123并且124,因为它们的Point3d匹配,但它们的标签不是,也是resultSet类型,Dictionary<string, List<pmatch>>因此您可以访问该pmatch对象的所有属性.

  • 好的解决方案 @Treefingers你也可以通过关注视觉工作室的知识分子来学习.学习linq,反射等是很有用的. (2认同)