具有动态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.ArgumentException
(At 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是我需要在每组中选择的字符串列表。
好的-这是一种方法,但它可能有点静态才有用。问题是我有这个部分:
.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);