C# 将重复的列折叠到子列表中

C# 将重复的列折叠到子列表中,c#,database,linq,c#-4.0,C#,Database,Linq,C# 4.0,将表格数据中的重复列折叠到列表中最优雅的方法是什么 示例:我编写了一个SQL查询,该查询返回的行中包含重复数据,但只有一个区分列除外: FIRST LAST AGE CAR Charles Burns 32 Accord Charles Burns 32 Buick Charles Burns 32 Lexus Anders Hejlsberg 51 Porsche Anders Hejlsberg 51 Ferrari

将表格数据中的重复列折叠到列表中最优雅的方法是什么

示例:我编写了一个SQL查询,该查询返回的行中包含重复数据,但只有一个区分列除外:

FIRST   LAST      AGE   CAR
Charles Burns     32    Accord
Charles Burns     32    Buick
Charles Burns     32    Lexus
Anders  Hejlsberg 51    Porsche
Anders  Hejlsberg 51    Ferrari
Anders  Hejlsberg 51    Bugatti
Anders  Hejlsberg 51    Pinto
我使用如下内容阅读这些内容,然后将它们放入CarInfo对象中:

while(reader.Read()) {
    first = reader["first"]
    last = reader["last"]
    //...
}
var myData = new CarInfo(first, last, ...);
该对象看起来像:

// CarInfo: Need 7 total instances with example data
string first { get; private set; }
string last { get; private set; }
int age { get; private set; }
string car { get; private set; }
我希望它看起来像:

// CarInfo: Need only 2 instances with example data; 
string first { get; private set; }
string last { get; private set; }
int age { get; private set; }
List<string> cars { get; private set; }
//CarInfo:只需要2个实例和示例数据;
第一个字符串{get;private set;}
字符串last{get;private set;}
int age{get;private set;}
列出汽车{get;private set;}
当然,我可以手动完成这项工作,例如,选择形成唯一ID的列,并检查它们是否已经在我的列表(或字典或任何东西)中,但这似乎非常困难。
我对LINQ非常熟悉,怀疑它可以完美地折叠这些数据,但对精确的方法还不够熟悉。

我昨天刚刚遇到这个问题,但我使用的是SO使用的漂亮的对象映射器。它使用“拆分”方法,您必须指定要将父列与子列分开的列或列列表:

List<CarInfo> parent = new List<CarInfo>();
CarInfo current = null;
var q = _conn.Query<CarInfo, string, CarInfo>(sql
    , (p, c0) =>
    {
        if (current == null || current.Id != p.Id)
        {
            current = p;
        }
        current.Cars.Add(c0);
        parents.Add(current);
        return current;
    }
    , splitOn: "CAR"
);
List parent=new List();
CarInfo current=null;
var q=_conn.Query(sql
,(p,c0)=>
{
if(current==null | | current.Id!=p.Id)
{
电流=p;
}
当前.车辆.添加(c0);
父母。添加(当前);
回流;
}
,斯普利顿:“汽车”
);

是否尝试了Enumerable.GroupBy函数?这就是你要找的吗

class A
        {
            public string a;
            public string b;
            public A(string x, string y)
            {
                a = x;
                b = y;
            }
        }
        static void Main(string[] args)
        {
            A[] tab = { new A("1", "1"), new A("2", "0"), new A("3", "1"), new A("4", "0"), new A("5", "1") };
            var g = tab.GroupBy(x => x.b);
            foreach (var x in g)
            {

                foreach (var y in x)
                {
                    Console.WriteLine(y.a + "/" + y.b);
                }
                Console.WriteLine("----");
            }
            Console.ReadKey();

        }
此代码返回:

{1,1}
{3,1}
{5,1}
--------
{2,0}
{4,0}
按字段b对元素进行分组

您可以使用:

列出车辆=
(来自tblCars.AsEnumerable()中的cRow)
新浪集团
{
first=cRow.Field(“first”),
last=cRow.Field(“last”),
年龄=乌鸦场(“年龄”)
}分组
选择新的CarInfo()
{ 
first=CarGroup.Key.first,
last=CarGroup.Key.last,
年龄=CarGroup.Key.age,
cars=CarGroup.Select(cRow=>cRow.Field(“Car”)).ToList()
}).ToList();
以三个字段作为密钥的匿名类型对上述组进行分组。然后用这些字段和一个包含每组所有车辆的
List
属性初始化
CarInfo
实例

List<CarInfo> cars = 
         (from cRow in tblCars.AsEnumerable()
          group cRow by new
          {
              first = cRow.Field<String>("first"),
              last  = cRow.Field<String>("last"),
              age   = cRow.Field<int>("age")
          }into CarGroup
          select new CarInfo() 
          { 
              first = CarGroup.Key.first,
              last  = CarGroup.Key.last,
              age   = CarGroup.Key.age ,
              cars  = CarGroup.Select(cRow => cRow.Field<String>("Car")).ToList()
          }).ToList();