我必须按照LINQ中单词的第一个字母进行分组。因为我是LINQ的新手,所以我不知道调试它。
//代码
var words4 = testDS.Tables["Words4"].AsEnumerable();
var wordGroups =
from w in words4
group w by w.Field<string>("word")[0] into g
select new {FirstLetter = g.Key, Words = g };
foreach (var g in wordGroups)
{
Console.WriteLine("Words that start with the letter '{0}':", g.FirstLetter);
Console.WriteLine(g.Field<string>("word"));
}
在最后一次Console.WriteLine中抛出“无效参数”执行。
答案 0 :(得分:2)
尝试在内部添加循环,以便更准确地获得结果。
替换:
Console.WriteLine(g.Field<string>("word"));
使用:
foreach (var w in g.Words)
{
Console.WriteLine(w.Field<string>("word"));
}
答案 1 :(得分:1)
由于在select
中,您创建了一个匿名对象,其字段指定为Words
,之后您通过word
访问该对象,此外Field
扩展方法也不是需要。
您需要替换:
Console.WriteLine(g.Field<string>("word"));
带
Console.WriteLine(g.Words);
答案 2 :(得分:1)
首先,由于您只想显示单词,而不是由DataRows组成的组,我会从数据行中选择您想要的单词。其次,请记住单词在列表中。如果你想打印它们,你需要循环或做一些像string.Join(如下所示)。例如:
var wordGroups =
from w in words4.Select(w => w.Field<string>("word"))
group w by w[0] into g
select new { FirstLetter = g.Key, Words = g };
foreach (var g in wordGroups) {
Console.WriteLine("Words that start with the letter '{0}':", g.FirstLetter);
Console.WriteLine(string.Join(", ", g.Words));
}
答案 3 :(得分:1)
这应该使用 Linq语法
从wordGroups
中获取您想要的内容
替换:
Console.WriteLine(g.Field<string>("word"));
使用:
g.Words.ForEach(w => Console.WriteLine(W.Field<string>("word"));
答案 4 :(得分:1)
另一种选择是这样的吗?
Dictionary<string, List<Product>> groupedDictionary = _db.Products.GroupBy(g => g.Name.Substring(0,1)).ToDictionary(g => g.Key, g => g.ToList());