我基本上用名字填充了一个数据表,现在我试图选择不同的名字并将它们放在列表中,但是当我尝试将linq查询转换为列表时,这给了我标题错误。我已经放入system.Linq
List<string> ItemNames = new List<string>();
var query1 = from r in DT.AsEnumerable()
group r by r.Field<string>("Name") into r
select r; // I also tried select r.ToList();
ItemNames = query1.ToList<string>();
我该如何解决这个问题?
答案 0 :(得分:5)
我认为DT
是DataTable
。
您的错误是:
“ IEnumerable
>”不包含“ ToList”的定义
您基本上是在尝试将复杂的对象放入字符串中:
IGrouping<string, DataRow> myGrouping = null;
string s = myGrouping; // This won't work
您必须Select
要在List<string>
中看到哪些字符串:
List<string> ItemNames = new List<string>();
var query1 = from r in new DataTable().AsEnumerable()
group r by r.Field<string>("Name") into r
select r; // I also tried select r.ToList();
ItemNames = query1.Select(s => s.Key).ToList<string>();
答案 1 :(得分:3)
怎么样:
List<string> ItemNames = DT.AsEnumerable()
.Select(ro => ro["Name"].ToString()) //pull the name out of the datarow, projecting an enumerable of the names. Remember that ro is a DataRow, and ro["Name"] is an object hence the ToString (could also have cast)
.Distinct() //reduce to just distinct names
.ToList(); //turn it to a list
在这里我们拉出所有名称,然后使用Distinct()来区分它们,而不是形成一个分组-我认为这比跟踪键和相关的行要少资源密集
关于原件出了什么问题,您误会了分组的工作方式。这将在此处创建类似Dictionary<string, List<DataRow>>()
的内容:
from r in DT.AsEnumerable()
group r by r.Field<string>("Name") into rr
表中的每个唯一名称都将成为字典键。然后,具有相同名称的每一行都会进入字典值(数据行列表)。当你说:
select rr; //you said r, but i renamed it to rr to make it more clear what is going on, this is a new object unrelated to your original r
rr
是字典项的值;它是具有相同名称的所有DataRows的列表。可能是该列表中的一项,也可能是数千项。进入Key
的{{1}}的人的名字不是。它是Grouping
的 value ;分组的值是Grouping
,它们都具有相同的名称,因此存储在一个键下。如果是List<DataRow>
:
Dictionary<string, List<DataRow>>
您可能已经选择了密钥,或者将名称从列表的第一行中拉出了
即您可以拥有:
List<DataRow> allPeopleCalledJohn = myDictionary["John"];
甚至:
List<string> ItemNames = new List<string>();
var query1 = from r in new DataTable().AsEnumerable()
group r by r.Field<string>("Name") into rr
select rr.Key; //its the key of the grouping, i.e. the name
ItemNames = query1.ToList<string>();
但是,为什么我不建议这样做,因为如果LINQ想要的只是名称,要求LINQ进行分组,然后将每个数据行追溯到其拥有的名称,这是浪费资源的浪费。本身。相反,如果您只拔出名称,将它们分开并列出它们,则可以在第一步中放弃其余的行数据,而不必将其拖到末尾然后扔掉