C# Linq Groupby返回原始对象

C# Linq Groupby返回原始对象,c#,linq,group-by,C#,Linq,Group By,我需要一些帮助来过滤一些数据。我有一个具有三个属性的对象类。我得到的对象集合可以与第一个属性Point3d有许多匹配项。从匹配的集合中,我需要查看第二个属性是否具有唯一的值Tag。最后,我需要能够使用第三个属性,即Id(始终是唯一的),识别Point3d匹配的对象和不同的标记 我正在寻找的一个例子是: List<pmatch> dataset = new List<pmatch> { new pmatch { Point3d = "1, 1, 1", Tag =

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

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

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" }
};

但是,这些结果没有给我Id,因此我无法访问已识别的对象。如何将这些结果与Id或pmatch对象本身一起获得?

您可以通过以下方式获得所需的结果:

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

这将标识Id的
123
124
,作为它们的点3DS匹配,但它们的标记不匹配,而且
resultSet
属于
Dictionary
类型,因此您可以访问
pmatch
对象的所有属性。

这非常有效,谢谢。我怎样才能像这样理解林克呢?@Treefingers你太受欢迎了:)。我想这一切都归结于练习。也许我可以推荐你浏览这个网站上的教程,并在你有时间的时候逐一浏览每个扩展方法教程,看看它是如何进行的。很好的解决方案@通过关注VisualStudio的IntelliSense,您还可以学习TreeFinger。学习linq、反射等都很有用。我的大部分高级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);
        }
    }
}
var resultSet = 
       dataset.GroupBy(item => item.Point3d)
              .Where(group => group.Select(item => item.Tag)
                                   .Distinct()
                                   .Count() > 1)
              .ToDictionary(item => item.Key, item => item.ToList());