我是c#的新手。我有像这样的数组值
id name subject marks
1 jhone math 60
2 smith science 50
3 clark math 90
1 jhone science 80
3 clark science 56
1 jhone ecnomics 75
2 smith math 40
3 clark ecnomics 99
首先我要按照这个排序数组
id name subject marks
1 jhone math 60
1 jhone science 80
1 jhone ecnomics 75
2 smith science 50
2 smith math 40
3 clark math 90
3 clark science 56
3 clark ecnomics 99
array.sort
命令正常工作
现在我想连接这些值并回答这样的显示
1,jhone,math 60,science 80,ecnomics 75
3,clark,math 90,science 56,ecnomics 99
请记住,我不想显示内容,因为id 2有2个主题..这个经济学结果正在等待......所以只显示结果中的上述两行。
提前致谢
答案 0 :(得分:1)
我真的不确定你在这里会发生什么,所以如果我偏离基地,请提供一些更详细的信息来解决你想要完成的事情。
话虽如此,使用LINQ你可以很容易地做到这一点:
首先,我从你正在使用的对象开始。我把它命名为Foo
,但这是(似乎是)你提供的结构:
public class Foo
{
public Int32 Id { get; set; }
public String Name { get; set; }
public String Subject { get; set; }
public Int32 Marks { get; set; }
}
接下来,您可以按ID进行分组和排序,然后提取与该分组匹配的结果:
var results = from b in Bar // Bar is my list of "Foo"s
orderby b.Id ascending // order it by ID
group b by b.Id into grp // then group them
select new
{
ID = grp.Key, // re-grab the ID
Foo = grp
};
现在我们浏览results
并过滤您似乎指定的“有三个选项”。您可能需要更加努力地确定结果是如何“可输出”的。
List<String> concat = new List<String>();
foreach (var result in results)
{
if (result.Foo.Count() == 3) // has three options?
{
List<String> vals = new List<string>();
vals.AddRange(new[]{ result.ID.ToString(), result.Foo.ElementAt(0).Name });
foreach (var foo in result.Foo)
vals.Add(String.Format("{0} {1}", foo.Subject, foo.Marks));
concat.Add(String.Join(",", vals.ToArray()));
}
}
现在concat
有以下内容:
1,jhone,math 60,science 80,economics 75
3,clark,math 90,science 56,economics 99
Press any key to continue . . .
答案 1 :(得分:0)
您应该能够通过使用Linq查询获取具有某些值的所有条目。例如,
StringBuilder sb = new StringBuilder();
foreach (String n in studentNames)
{
IEnumerable<Record> query = from r in studentArray where r.Name == nameIter select r;
sb.Append(r.id.ToString() + "," + r.name);
foreach (Record r in query)
{
sb.Append("," + r.className);
sb.Append(" " + r.score)
}
sb.Append("\n");
}
你还有其他要求不向学生展示只有2条记录,但我不清楚你想要什么。
答案 2 :(得分:0)
对阵列进行排序后,按顺序执行,为每个学生构建List
。当学生编号发生变化时,只有在涵盖所有科目时才输出。
假设你有这门课程:
class StudentGrade
{
public int Id { get; private set; }
public string Name { get; private set; }
public string Subject { get; private set; }
public int Marks { get; private set; }
// Constructor and other things go here
}
你有一系列你已经分类的那些:
StudentGrade[] Grades;
现在,您想为每个拥有所有三个等级的学生输出一行:
List<StudentGrade> l = new List<StudentGrade>();
int LastId = -1;
foreach (var grade in Grades)
{
if (grade.Id == LastId || LastId == -1)
{
// add this item to the list
l.Add(grade);
}
else
{
// New student. Output data for previous student.
if (l.Count == 3)
{
// output this student.
}
else
{
// student not output because not all grades are in.
}
LastId = grade.Id;
l.Clear();
l.Add(grade);
}
}
// Check last student
if (l.Count == 3)
{
// output last student
}
else
{
// don't output because not all grades are in
}
}