这是我问过的另一个问题的根源,它解决了这个问题的一部分 -
现在我试图以下列方式编写整个逻辑 -
var divisions = (
from DataRow row in results.Rows
let section = row["SECTION"].ToString()
orderby section ascending
select section).Distinct();
string result = String.Empty;
foreach (string div in divisions)
{
result = String.Concat(result, div, Environment.NewLine);
var query =
from DataRow row in results.Rows
let remarks = row["REMARKS"].ToString()
let exam = row["EXAM_NAME"].ToString()
let rollno = row["ROLL_NO"].ToString()
let section = row["SECTION"].ToString()
where (remarks == "Passes" || remarks == "Promoted") &&
exam == "TOTAL" && section == div
orderby rollno
select rollno;
result = String.Concat(result,string.Join(" ", query.ToArray()),
Environment.NewLine);
}
基本上,原始数据表有一堆行,各种信息包括Division。我想创建一个单独的字符串,每个分区出现在一个新行上,而在下面,该分区的roll nos以逗号分隔的方式显示。下一行的下一个分区,依此类推。 (这里的部门和部门是可互操作的术语)。
有没有一种优雅的方法可以用一个linq查询来编写它,而不必遍历第一个查询的结果?
编辑:
数据(未提及过滤条件中使用的其他列)
Roll_no Section.. other cols
001 A
002 A
001 B
003 A
004 B
006 B
这就是输出的样子 - (roll no在分区中是唯一的,但不应该以任何方式影响逻辑)
A
001 002 003
B
001 004 006
当字符串为原始格式时,这将类似于'A \ r \ n001 002 003 \ r \ nB \ r \ n001 004 006'。
注意,上面的代码有效。我只是在寻找更好的方法。
答案 0 :(得分:3)
您希望实现两个单独的要求,并且不应尝试将它们合并为单个要素。您1.希望将结果分组为togetter 2.具有特定的演示需求。
以下是如何执行此操作的方法:
var query =
from DataRow row in results.Rows
// here the query stuff you already had
select new { rollno, section, exam, remarks };
// 1. Grouping
var groups =
from item in query
group item by item.section into g
select new
{
Section = g.Key,
Rollnos = g.Select(i => i.rollno).ToArray(),
};
// 2. Presentation
foreach (var group in groups)
{
Console.WriteLine(group.Section);
Console.WriteLine(string.Join(" ", group.Rollno));
}
可以编写一个也为您做部分演示的单个查询,但是这个查询会变得非常讨厌且难以理解。