按单词在LINQ中的首字母排序

本文关键字:排序 单词 LINQ | 更新日期: 2023-09-27 18:03:55

我必须在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.

按单词在LINQ中的首字母排序

抛出"Invalid Arguments"异常

试着在里面添加一个循环,这样你可以更准确地得到结果。

替换:

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

:

foreach (var w in g.Words)
{
    Console.WriteLine(w.Field<string>("word"));
}

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

你需要替换:

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

Console.WriteLine(g.Words);

首先,不是由数据row组成的组,因为您只想显示单词,所以我将从数据row中选择您想要的单词。其次,记住单词是在一个列表中。如果你想把它们打印出来,你需要循环或者做一些类似string的事情。加入(就像我下面做的那样)。例如:

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));
}

使用Linq语法从wordGroups中获取您想要的内容:

替换:

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

:

g.Words.ForEach(w => Console.WriteLine(W.Field<string>("word"));

另一个选项是这样的?

Dictionary<string, List<Product>> groupedDictionary = _db.Products.GroupBy(g => g.Name.Substring(0,1)).ToDictionary(g => g.Key, g => g.ToList());