4

我必须在 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 中抛出“无效参数”执行。

4

5 回答 5

2

尝试在内部添加一个循环,以便更准确地获得结果。

代替:

Console.WriteLine(g.Field<string>("word"));

和:

foreach (var w in g.Words)
{
    Console.WriteLine(w.Field<string>("word"));
}
于 2013-03-15T06:43:35.807 回答
1

由于在您的 中select,您创建了一个字段指定为的匿名对象,Words后来您通过 访问它wordField也不需要扩展方法。

您需要更换:

Console.WriteLine(g.Field<string>("word"));

Console.WriteLine(g.Words);
于 2013-03-15T04:53:47.107 回答
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));
}
于 2013-03-15T06:27:46.120 回答
1

wordGroups这应该使用Linq 语法从内部获取您想要的内容:

代替:

Console.WriteLine(g.Field<string>("word"));

和:

g.Words.ForEach(w => Console.WriteLine(W.Field<string>("word"));
于 2013-03-15T07:52:57.677 回答
1

另一种选择是这样的?

Dictionary<string, List<Product>> groupedDictionary = _db.Products.GroupBy(g => g.Name.Substring(0,1)).ToDictionary(g => g.Key, g => g.ToList());
于 2013-08-05T13:33:06.803 回答