LINQ foreach循环中的System.Linq.Enumerable + d__3a`1 [System.String]错误

Ela*_*e K 2 c# linq

我有一个列表,我试图从另一个列表中填充,我想要结合一些数据,并消除一些.

在原始列表中,数据如下所示:

 Id     Text      Description

  1      Apple     Red Delicious
  1      Apple     Green
  1      Apple     Granny 
  2      Tomato    Roma
  2      Tomato    Cherry   
Run Code Online (Sandbox Code Playgroud)

我想在第二个列表中压缩此信息,如下所示:

  Id    Text     Description
  1     Apple    Red Delicious, Green, Granny
  2     Tomato   Roma, Cherry 
Run Code Online (Sandbox Code Playgroud)

我的类对象声明如下:

 [Serializable]
 public class Food
 {
     public int Id { get;set; }
     public string Text { get;set; }
     public string Description { get;set; } 
 }
Run Code Online (Sandbox Code Playgroud)

所以我想循环遍历旧列表,这就是我在代码中尝试这样做的方式:

var ids = oldList.Select(i => i.Id).Distinct(); //get distinct list of ids (e.g. 1,2)
List<Food> newList = ids.Select(i => new Food(){
   Id = i,
   Text = oldList.Where(o => o.Id == i).Select(o => o.Text).Take(1).ToString(),
   Description = string.Join(",", oldList.Where(o => o.Id == i).Select(o => o.Description).ToString())
}).ToList();
Run Code Online (Sandbox Code Playgroud)

现在我因为.Take()而得到System.Linq.Enumerable + d__3a`1 [System.String]错误,但是如果我只改变它.ToString(),我会得到一个略有不同的错误但是来自同一个source System.linq.Enumerable,如果我做FirstOrDefault()同样的东西,.Distinct()同样的事情.

我想我明白问题是,对于Text和Description,它返回IEnumerable for Text和Description所以我没有得到我想要的实际值,我不确定我是否理解如何正确转换它.ToList().访问这些值的正确方法是什么?

Jon*_*eet 7

你调用ToString()上的结果TakeSelect-这不会做什么好东西.目前尚不清楚为什么ToString明确地打电话DescriptionText你,而你真的想要FirstOrDefault或者更First确切地说,因为你只想得到第一个结果:

List<Food> newList = ids.Select(i => new Food {
   Id = i,
   Text = oldList.Where(o => o.Id == i).Select(o => o.Text).FirstOrDefault(),
   Description = string.Join(",", oldList.Where(o => o.Id == i)
                                         .Select(o => o.Description))
}).ToList();
Run Code Online (Sandbox Code Playgroud)

基本上,调用ToString()sequence(IEnumerable<T>)几乎不合适.