具有动态linq的组的顺序

本文关键字:顺序 linq 动态 | 更新日期: 2023-09-27 18:24:57

有点类似于这个问题:

我该把";orderby group.key";在这个LINQ声明中?

不过我用的是Dynamic.Linq,这让这有点难。我有一堆来自数据库的数据,然后按某个字段分组,然后输出结果。问题是,组的排序似乎是随机的,这对最终用户来说不是很方便。因此,从相关问题中获得灵感,如果我有这个:

string[] words = { "boy","car", "apple", "bill", "crow", "brown" };
// note the first non-dynamic select here was just because I don't think dynamic linq 
// will support indexing a string like that and it's not an important detail anyway
var wordList = words.Select(w => new {FirstLetter = w[0], Word = w})
                    .GroupBy("new (FirstLetter)","Word");  
foreach(IGrouping<object, dynamic> g in wordList)
{
    Console.WriteLine("Words that being with {0}:",
        g.Key.ToString().ToUpper());
    foreach (var word in g)
        Console.WriteLine("  " + word);
}
Console.ReadLine();

我该如何订购钥匙?问题的至少一部分是动态CCD_ 1返回一个CCD_。我想这可能很容易:

var wordList = words.Select(w => new {FirstLetter = w[0], Word = w})
                    .GroupBy("new (FirstLetter)","Word")
                    .OrderBy("Key"); 

但当它进入foreach循环时,这给了我一个System.ArgumentExceptionAt least one object must implement IComparable.)。

我的项目中的实际代码有点复杂,看起来像这样:

var colGroup = row.GroupBy(string.Format("new({0})", 
                           string.Join(",", c)), string.Format("new({0})", 
                           string.Join(",", v)));

其中c是我需要分组的字符串列表,v是我需要在每组中选择的字符串列表。

具有动态linq的组的顺序

好的-这是一种方法,但它可能有点静态才有用。问题是我有这个部分:

.GroupBy("new (FirstLetter)","Word");  

使用new是因为我不能将值类型用作键(我对此有另一个问题:https://stackoverflow.com/a/26022002/1250301)。当使用OrderBy("Key")部分时,问题是它没有办法比较这些动态类型。我可以这样解决:

var wordList = words.Select(w => new {FirstLetter = w[0].ToString(), Word = w})
                    .GroupBy("FirstLetter","Word")
                    .OrderBy("Key"); 

把钥匙做成一串。或者像这样:

var wordList = words.Select(w => new {FirstLetter = w[0], Word = w})
                    .GroupBy("new (FirstLetter as k)","Word")
                    .OrderBy("Key.k");

通过可比较的东西(字符)进行排序。

我可以让它解决我的实际问题(但它有点丑陋):

var colGroup = row.GroupBy(string.Format("new({0})", string.Join(",", c)),
                           string.Format("new({0})", string.Join(",", v)))
                  .OrderBy(string.Join(",", c.Select(ob => string.Format("Key.{0}", ob))));

我不确定你想做什么,但这种语法甚至是在编译吗?

尝试:

string[] words = { "boy","car", "apple", "bill", "crow", "brown" };
var wordList = words.Select(w => new {FirstLetter = w[0], Word = w})
                    .GroupBy(x => x.FirstLetter, x => x.Word)
                    .OrderBy(x => x.Key);