2016-09-24 32 views
1

我有一个结构作为集团通过在C#中的多列结构列表

public struct structMailJob 
{ 
public string ID; 
public string MailID; 
public int ResendCount; 
public int PageCount; 
} 

和列表作为

List<structMailJob> myStructList = new List<structMailJob>(); 

我从数据库加载数据 myStructList,想myStructList数据在由MailID和ResendCount分组后的新列表中。

我试图为:

List<structMailJob> newStructList = new List<structMailJob>(); 

newStructList = myStructList.GroupBy(u => u.MailID, u=>u.ResendCount) 
            .Select(grp => new { myStructList = grp.ToList() }) 
            .ToList(); 

,但无法做到,由于收到错误消息 - 不能泛型列表隐式转换到structMailJob。

+0

请到这个[链接](http://stackoverflow.com/问题/ 847066/group-by-multiple-columns) –

+0

使用var变量并检查query.check天气它是类型错误@ gaurav –

+0

'grp => new {myStructList = grp.ToList()}'语句创建一个匿名对象的唯一属性是名为myStructList的列表。这种类型将作为结果集合的项目, 而您期望收集您的特定类型。 集合类型不匹配,因此是例外。
我会很乐意帮助你实现你的目标,如果你告诉我你想要对数据做什么..有几种方法可以去取决于用例.. –

回答

1

LINQ查询是完全不正确,以下是要点:

myStructList.GroupBy(u => u.MailID, u=>u.ResendCount) //不正确的分组

myStructList.GroupBy(u => new {u.MailID, u.ResendCount }) //正确分组,将由两列MailIDResendCount做,最后一个只做MailID并且使用ResendCount进行结果预测

现在结果是IEnumerable<IGrouping<AnonymousType,structMailJob>>,所以当你这样做Select,它最终将建立IEnumerable<List<structMailJob>>型的拼接列表(删除分配到myStructList选择里面,因为这是不正确的):

.Select(grp => grp.ToList()) 

正确的代码将要求您采用扁平化作为SelectMany如下:

newStructList = myStructList.GroupBy(u => new {u.MailID, u.ResendCount}) 
             .SelectMany(grp => grp.ToList()).ToList(); 

将其分配给newStructList,但是这个代码已经很少使用,因为从字面上newStructList是完全一样的myStructList扁平化后,最好你应该能够使用分组,这样哟ü可以得到一个子集,因此正确的结果,但是这取决于你的业务逻辑

+0

谢谢,它的工作。 – Gaurav

0

我不知道我的问题是否正确,但在我看来,您错过了'Group by'签名。

List<structMailJob> myStructList = new List<structMailJob>(); 

List<structMailJob> newStructList = new List<structMailJob>(); 

newStructList = myStructList 
    // .GroupBy(/*Key Selector */u => u.MailID, /*Element Selector*/u=>u.ResendCount)   
    .GroupBy(u => new { u.MailID, u.ResendCount }) // broup by MailID, ResendCount 
    // Note no Element Selector , the 'STRUCT' is 'SELECTED' 
    .Select(grp => { 
     // NOte: Key == Anonymous {MailID, ResendCount } 
     return grp; 
    }) 
    // otherwise you get a IEnumerable<IEnumerable<T>> instead of IEnumerable<T> because you grouped it 
    .SelectMany(x=>x) 
    .ToList(); 
1

我认为你正在寻找的是以下几点:

var newStructList = myStructList.GroupBy(smj => new { smj.MailID, smj.ResendCount }) 
           .Select(grp => new 
           { 
            MailID = grp.Key.MailID, 
            ResendCount = grp.Key.ResendCount 
            MailJobs = grp.Select(x=>new 
               { 
                x.ID, 
                x.PageCount 
               }).ToList() 
           }) 
           .ToList(); 

注意,我们改变了GroupBy条款以下之一:

GroupBy(smj => new { smj.MailID, smj.ResendCount }) 

这样做,在这将要创建的组将键由两个MailIDResendCount的。顺便说一句,前GroupBy条款是不正确的。

然后成就了分组,我们预计各组对象具有三个属性,MailIDResendCout,这是匿名类型的对象有两个属性,IDPageCount键和列表的组件,这是我们给它名字MailJobs。

最后但并非最不重要,你会发现,我没有提到以下

List<structMailJob> newStructList = new List<structMailJob>(); 

我只是用var并宣布newStructList。我不认为你在你的帖子中陈述有道理。我们如何期望在对它们进行分组后得到相同对象的列表?所以我假设,你可能想要的是以上。

但是,我想你可能也想这样,你不想参考分组

myStructList = myStructList.OrderBy(smj => smj.MailID) 
          .ThenBy(smj => smj.ResendCount) 
          .ToList(); 
+0

谢谢,它的工作。 – Gaurav

+0

@Gaurav不客气。 – Christos

+0

感谢您的帮助,在您的第一个解决方案中,我猜想有小错字,并添加了smj。作为新的{smj.MailID,smj.ResendCount}和逗号后ResendCount = grp.Key.ResendCount, – Gaurav

0

如果Mrinal Kamboj的答案是你在找什么,那么你可以使用下面的替代:

var orderedList = myStructList.OrderBy(x => x.MailID).ThenBy(x => x.ResendCount);