按LINQ中第一个字母的单词列表分组

时间:2013-03-15 04:51:28

标签: c# .net linq

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

5 个答案:

答案 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());