问题排序数组

时间:2011-04-18 13:01:20

标签: c# .net vb.net

我是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个主题..这个经济学结果正在等待......所以只显示结果中的上述两行。

提前致谢

3 个答案:

答案 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
}

}