c# - Sort and Group in LINQ -
i have list of string tuples, (p1,p2)
i'd know if there's linq statement group p1 (in ascending order), , have group contain p2 values group (in descending order).
for input: ("a","b"), ("a","c"), ("d","b") i'd 2 groups: "a" , "d" (in order, every time) group "a" contains "c" , "b" (in order, every time) , group "d" contains, well, "b".
is possible built-in linq classes or need iterate groups , sort them myself?
nope, it's not hard - need keep track of whether you're looking @ group or elements within group. here's sample query:
var query = tuple in tuples orderby tuple.p1 group tuple.p2 tuple.p1 g select new { group = g.key, elements = g.orderbydescending(p2 => p2) };
here's complete example (avoiding .net 4's tuple
type simplicity if you're using .net 3.5):
using system; using system.collections.generic; using system.linq; public class mytuple { public string p1 { get; set; } public string p2 { get; set; } } class test { static void main() { list<mytuple> tuples = new list<mytuple> { new mytuple { p1 = "a", p2 = "b" }, new mytuple { p1 = "a", p2 = "c" }, new mytuple { p1 = "d", p2 = "b" }, }; var query = tuple in tuples orderby tuple.p1 group tuple.p2 tuple.p1 g select new { group = g.key, elements = g.orderbydescending(p2 => p2) }; foreach (var group in query) { console.writeline("{0}:", group.group); foreach (var value in group.elements) { console.writeline(" {0}", value); } } } }
note can simpler if you're happy ordering on "need know" basis:
var query = tuple in tuples orderby tuple.p1 group tuple.p2 tuple.p1; foreach (var group in query) { console.writeline("{0}:", group.key); foreach (var value in group.orderbydescending(x => x)) { console.writeline(" {0}", value); } }
Comments
Post a Comment