Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建查询以某种格式排列数据?_C#_Linq - Fatal编程技术网

C# 如何创建查询以某种格式排列数据?

C# 如何创建查询以某种格式排列数据?,c#,linq,C#,Linq,这是我的班级: public class Students { public String StudentName public int CountActivities public List<Activities> lstActivities = new List<Activities>(); } public class Activities { public String ActivityName public int

这是我的班级:

public class Students
{
    public String StudentName
    public int CountActivities
    public List<Activities> lstActivities = new List<Activities>();
}    
public class Activities
{
    public String ActivityName
    public int ActivityScore
}
公共班级学生
{
公共字符串StudentName
公众活动
公共列表活动=新列表();
}    
公共课堂活动
{
公共字符串ActivityName
公共int活动分数
}
我想创建一个查询,在datagrid中将学生姓名显示为行,将ActivityName显示为列。如果某项活动是由学生完成的,则在相应的行和单元格中显示分数。我们知道活动列表的计数可以从1到X不等,但不能超过X。我希望CountActivities是学生姓名旁边的第二列。第3列之后的部分标有学生参与的各种活动名称

如何创建查询以在datagrid中显示所需内容?我知道我必须创建一个查询来生成一个列表。然后我可以将datagrid的源设置为列表(我想)。我的问题是理解如何制定查询,以我刚才描述的格式显示信息

抱歉,我之前没有添加此部分:

List<Students> lstHighSchool = new List<Students>();
var Query = lstHighSchool ( *no clue*).ToList():
//from here I can hopefully assign List to datagrid's source.
List lstHighSchool=新列表();
var Query=lstHighSchool(*无线索*).ToList():
//从这里,我有希望将列表分配给datagrid的源代码。
在Linq中这将是困难的(而且是静态的),我将创建一个DataTable,在活动中循环,如果不存在列,则创建列

伪代码:

DataTable dt
add column Name
add column CountActivities
foreach(student)
{
    add row
    row[Name] = student.Name
    row[CountActivities] = student.CountActivities
    foreach(activity)
    {
        if(! (dt contains column (activity.ActivityName)))
            add column (activity.ActivityName)
        row[activity.ActivityName] = ActivityScore
    }
}

您要做的是称为“透视表”

这在LINQ是不可行的。见()


在这里查看另一个选项:

我认为你的问题是具有挑战性的,所以我一直在尝试达到这一点。不确定它是否是你想要的,它需要清理一点,使它更通用

我的想法是构建一个linq扩展来提供您所要求的结构。我将数据移动到一个元组中,其中Item1是一个包含StudentName的字符串,Item2是一个ActivityScores列表,其中有足够的行用于所有不同的活动名称。分数被正确地添加到与我从学生列表创建的已排序的不同列表相匹配的列中,以便为每个活动分数获得正确的列

然后将结果打印到调试窗口。结果对于我的示例是正确的,但可能存在一些错误。无论如何,这是一个开始:)

另一个路径可能只是构建一个列表来代替
元组,并将所有内容转换为字符串进行显示。
欢迎提出任何建议

在这里:

    using System;
    using System.Collections.Generic;
    using System.Linq;


    namespace SO
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Create Students List
                var students = new List<Student>()
                {
                    new Student
                    {
                        FirstName = "Paul",
                        LastName = "Smith",
                        ActivityList = new List<Activity>() { 
                            new Activity
                            {
                                ActivityName = "Math", ActivityScore = 90                        
                            },
                           new Activity
                            {
                                ActivityName = "Biology", ActivityScore = 92                        
                            },
                           new Activity
                            {
                                ActivityName = "C#", ActivityScore = 93                        
                            }
                        }
                    },
                    new Student
                    {
                        FirstName = "Mary",
                        LastName = "Jones",
                        ActivityList = new List<Activity>() { 
                            new Activity
                            {
                                ActivityName = "Linq", ActivityScore = 95                       
                            },
                           new Activity
                            {
                                ActivityName = "Phyics", ActivityScore = 99                        
                            },
                           new Activity
                            {
                                ActivityName = "C#", ActivityScore = 99                        
                            }
                        }
                    },
                    new Student
                    {
                        FirstName = "Slick",
                        LastName = "Willy",
                        ActivityList = new List<Activity>() { 
                            new Activity
                            {
                                ActivityName = "Wine", ActivityScore = 90                        
                            },
                           new Activity
                            {
                                ActivityName = "Women", ActivityScore = 99                        
                            },
                           new Activity
                            {
                                ActivityName = "Politics", ActivityScore = 85                        
                            }
                        }
                    }

                };



                // Created a sorted list of activity Names
                var activities = (from s in students from a in s.ActivityList select (a.ActivityName)).Distinct().ToList();
                activities.Sort();

                // Create a Tuple of <Name,Activities>
                var grid = students.DataGrid(activities);


                // Print Header
                System.Diagnostics.Debug.Write(string.Format("{0,-12}", "Name"));
                foreach (var item in activities)
                {
                   System.Diagnostics.Debug.Write(string.Format("{0,12}",item));
                }
                System.Diagnostics.Debug.WriteLine("");

                // Print Rows
                foreach (var t in grid)
                {
                    System.Diagnostics.Debug.Write(string.Format("{0,-12}", t.Item1));
                    foreach (var s in t.Item2)
                    {
                        System.Diagnostics.Debug.Write(string.Format("{0,12}", s));
                    }
                    System.Diagnostics.Debug.WriteLine("");
                }

                // Done
            }
        }



    public class Student
    {
        public String FirstName { get; set; }
        public String LastName { get; set; }
        public List<Activity> ActivityList { get; set; }
    }    

    public class Activity
    {
        public String ActivityName { get; set; }
        public int ActivityScore { get; set; }
    }


    public static class LinqExt2
    {
        public static IEnumerable<Tuple<string, System.Collections.Generic.List<int>>> DataGrid<T>(this IEnumerable<T> source, IEnumerable<string> columnList)
        {


            using (var iterator = source.GetEnumerator())
            {
                // A List of Tuples in the format <string, List<int>>
                var results = new List<Tuple<string, List<int>>>();

                // each Student
                while (iterator.MoveNext())
                {
                    var a = iterator.Current as Student;
                    if (a == null)
                        continue;

                    // initalize all cols to 0;
                    var columnValues = columnList.Select(v => 0).ToList();

                    // each Activity
                    foreach (var item in a.ActivityList)
                    {
                        var name = item.ActivityName;
                        var i = 0;
                        foreach (var activity in columnList)
                        {
                            if (name.Equals(activity))
                            {
                                columnValues[i] = item.ActivityScore;
                                break;
                            }
                            i++;
                        }
                    }
                    results.Add(Tuple.Create(a.FirstName, columnValues));
                }

                return results;
            }
        }
    }




    }
使用系统;
使用System.Collections.Generic;
使用System.Linq;
名称空间SO
{
班级计划
{
静态void Main(字符串[]参数)
{
//创建学生列表
var students=新列表()
{
新生
{
FirstName=“保罗”,
LastName=“史密斯”,
ActivityList=新列表(){
新活动
{
ActivityName=“数学”,ActivityScore=90
},
新活动
{
ActivityName=“生物学”,ActivityScore=92
},
新活动
{
ActivityName=“C#”,ActivityScore=93
}
}
},
新生
{
FirstName=“玛丽”,
LastName=“琼斯”,
ActivityList=新列表(){
新活动
{
ActivityName=“Linq”,ActivityScore=95
},
新活动
{
ActivityName=“Phyics”,ActivityScore=99
},
新活动
{
ActivityName=“C#”,ActivityScore=99
}
}
},
新生
{
FirstName=“Slick”,
LastName=“威利”,
ActivityList=新列表(){
新活动
{
ActivityName=“Wine”,ActivityScore=90
},
新活动
{
ActivityName=“女性”,ActivityScore=99
},
新活动
{
ActivityName=“政治”,ActivityScore=85
}
}
}
};
//创建了活动名称的排序列表
var activities=(从s.ActivityList中的学生中选择(a.ActivityName)).Distinct().ToList();
activities.Sort();
//创建一个
var grid=students.DataGrid(活动);
//打印页眉
System.Diagnostics.Debug.Write(string.Format(“{0,-12}”,“Name”));
foreach(活动中的var项目)
{
System.Diagnostics.Debug.Write(string.For
    using System;
    using System.Collections.Generic;
    using System.Linq;


    namespace SO
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Create Students List
                var students = new List<Student>()
                {
                    new Student
                    {
                        FirstName = "Paul",
                        LastName = "Smith",
                        ActivityList = new List<Activity>() { 
                            new Activity
                            {
                                ActivityName = "Math", ActivityScore = 90                        
                            },
                           new Activity
                            {
                                ActivityName = "Biology", ActivityScore = 92                        
                            },
                           new Activity
                            {
                                ActivityName = "C#", ActivityScore = 93                        
                            }
                        }
                    },
                    new Student
                    {
                        FirstName = "Mary",
                        LastName = "Jones",
                        ActivityList = new List<Activity>() { 
                            new Activity
                            {
                                ActivityName = "Linq", ActivityScore = 95                       
                            },
                           new Activity
                            {
                                ActivityName = "Phyics", ActivityScore = 99                        
                            },
                           new Activity
                            {
                                ActivityName = "C#", ActivityScore = 99                        
                            }
                        }
                    },
                    new Student
                    {
                        FirstName = "Slick",
                        LastName = "Willy",
                        ActivityList = new List<Activity>() { 
                            new Activity
                            {
                                ActivityName = "Wine", ActivityScore = 90                        
                            },
                           new Activity
                            {
                                ActivityName = "Women", ActivityScore = 99                        
                            },
                           new Activity
                            {
                                ActivityName = "Politics", ActivityScore = 85                        
                            }
                        }
                    }

                };



                // Created a sorted list of activity Names
                var activities = (from s in students from a in s.ActivityList select (a.ActivityName)).Distinct().ToList();
                activities.Sort();

                // Create a Tuple of <Name,Activities>
                var grid = students.DataGrid(activities);


                // Print Header
                System.Diagnostics.Debug.Write(string.Format("{0,-12}", "Name"));
                foreach (var item in activities)
                {
                   System.Diagnostics.Debug.Write(string.Format("{0,12}",item));
                }
                System.Diagnostics.Debug.WriteLine("");

                // Print Rows
                foreach (var t in grid)
                {
                    System.Diagnostics.Debug.Write(string.Format("{0,-12}", t.Item1));
                    foreach (var s in t.Item2)
                    {
                        System.Diagnostics.Debug.Write(string.Format("{0,12}", s));
                    }
                    System.Diagnostics.Debug.WriteLine("");
                }

                // Done
            }
        }



    public class Student
    {
        public String FirstName { get; set; }
        public String LastName { get; set; }
        public List<Activity> ActivityList { get; set; }
    }    

    public class Activity
    {
        public String ActivityName { get; set; }
        public int ActivityScore { get; set; }
    }


    public static class LinqExt2
    {
        public static IEnumerable<Tuple<string, System.Collections.Generic.List<int>>> DataGrid<T>(this IEnumerable<T> source, IEnumerable<string> columnList)
        {


            using (var iterator = source.GetEnumerator())
            {
                // A List of Tuples in the format <string, List<int>>
                var results = new List<Tuple<string, List<int>>>();

                // each Student
                while (iterator.MoveNext())
                {
                    var a = iterator.Current as Student;
                    if (a == null)
                        continue;

                    // initalize all cols to 0;
                    var columnValues = columnList.Select(v => 0).ToList();

                    // each Activity
                    foreach (var item in a.ActivityList)
                    {
                        var name = item.ActivityName;
                        var i = 0;
                        foreach (var activity in columnList)
                        {
                            if (name.Equals(activity))
                            {
                                columnValues[i] = item.ActivityScore;
                                break;
                            }
                            i++;
                        }
                    }
                    results.Add(Tuple.Create(a.FirstName, columnValues));
                }

                return results;
            }
        }
    }




    }