Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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# 如何使用LINQ对这些json对象进行排序?_C#_Json_Linq_Generic List - Fatal编程技术网

C# 如何使用LINQ对这些json对象进行排序?

C# 如何使用LINQ对这些json对象进行排序?,c#,json,linq,generic-list,C#,Json,Linq,Generic List,对于这样的数据(作为旁注,json文件中的这些单独组件正确地称为什么-记录?项目?元素?对象?JSONPieceSpats?): …我想根据StudentID_FK与AssistantID_FK合作的次数对这些对象(或它们的名称)进行排序,并在列表顶部将两者分配到一起的次数最少。注意,两个从未分配在一起的项应该是有序列表中的第一项,而分配在一起次数最多的项应该在底部 注意:一次出现为“学生身份”的人下一次可能会出现为“助教身份”,反之亦然 要确定这一点,需要查询整个json文件。我相信我可以得到

对于这样的数据(作为旁注,json文件中的这些单独组件正确地称为什么-记录?项目?元素?对象?JSONPieceSpats?):

…我想根据StudentID_FK与AssistantID_FK合作的次数对这些对象(或它们的名称)进行排序,并在列表顶部将两者分配到一起的次数最少。注意,两个从未分配在一起的项应该是有序列表中的第一项,而分配在一起次数最多的项应该在底部

注意:一次出现为“学生身份”的人下一次可能会出现为“助教身份”,反之亦然

要确定这一点,需要查询整个json文件。我相信我可以得到这样的计数(假设studentlist是一个学生列表,如json文件所示):

…但我如何在列表的LINQ查询中使用它?计数不是学生班的成员,那么可以使用什么“技巧”根据这些计数来排序结果

我需要的是从同一个列表中同时订购两份。第一个按WeekOfAssignment排序,另一个按包含其他人员列表的“旁边”排序,按他们与从第一个查询填充的checkedlistbox中当前突出显示的人员一起工作的最少次数排序

在伪代码中,我需要的是:

List<Student> orderedStudents = studentlist.OrderBy(WeekOfAssignment);
首先,根据下一次任务类型获取初始助理列表,按上次任务日期排序;例如,对于支持#2的作业#3:

接下来,创建该子列表的新版本,填充OptionalOrderingVal成员:

int countOfAssignmentsWithStudent = 0;
int StudentId = comboboxRVStudent.SelectedValue;
foreach (Student assistant in RVAssistantsList)
{
    countOfAssignmentsWithStudent = assignmentsList.Where(StudentID_FK == StudentId && AssistantID_FK == AssistantId || StudentID_FK == AssistantId && AssistantID_FK == StudentId);
    assistant.OptionalOrderingVal = countOfAssignmentsWithStudent;
}
然后,按新值对助手列表进行排序:

RVAssistantsList = RVAssistantsList
    .OrderBy(o => o.OptionalOrderingVal)
    .ThenBy(w => w.WeekOfLastAssignment)
    .ToList();
最后,将该列表分配到相应的复选框:

checklistboxRVAssistants.Items = RVAssistantsList;

我可以称之为克鲁德格伦或伊莱吉;YMMV.

如果您有这样的型号:

public class Student
{
    public DateTime WeekOfAssignment { get; set; }
    public int TalkType { get; set; }
    public int StudentID_FK { get; set; }
    public int AssistantID_FK { get; set; }
    public int CounselPoint { get; set; }
    public bool HasBeenEmailed { get; set; }
    public bool SlipHasBeenPrinted { get; set; }
}
您可以使用匿名类型按属性
StudentID\u FK
AssistantID\u FK
对linq查询进行分组,并根据其大小对这些组进行排序,然后再次加入元素

这将根据成对的
StudentID\u FK
AssistantID\u FK
在列表中出现的次数对元素进行排序,最低次数优先:

var result = studentlist.GroupBy(m => new 
                                { 
                                    A = Math.Min(m.StudentID_FK, m.AssistantID_FK),  // This gets pairs like (1, 2) and (2, 1)
                                    B = Math.Max(m.StudentID_FK, m.AssistantID_FK)   // as the same (1, 2)
                                })
                    .OrderBy(g => g.Count())
                    .SelectMany(g => g)
                    .ToList();

您需要的是按一对学生ID显示为学生或助理的次数排序,反之亦然。因此:

        var orderedAssistants = studentlist
            .OrderBy(a => GetCountOfTimesWorkedTogether(studentlist, a.StudentID_FK, a.AssistantID_FK))
            .ToList();
使用

使用

public static class EnumerableExtensions
{
    public static HashSet<T> ToSet<T>(this IEnumerable<T> source)
    {
        return new HashSet<T>(source);
    }
}
公共静态类EnumerableExtensions
{
公共静态HashSet-ToSet(此IEnumerable源)
{
返回新的哈希集(源);
}
}

我认为您的计数需要处理
学生==助手
的情况,假设这是可能的。不,学生和助手在一个对象中永远不会是相同的。如果两个对象没有分配在一起,您希望如何查找?我的意思是,这个列表是由那些已经被分配到一起的学生组成的,可能还有其他一些学生没有被分配,因此他们的名字不在列表中。@user3473830:下一个任务是作为讨论中谈话类型的助手的所有学生都在第二个复选框中,他们上一次的任务是多久前下达的;如果他们还没有,他们将排在榜首。然后,当一个学生在第一个(学生)复选框中被选中时,我想按照他们被分配与该学生一起工作的时间对助手的复选框内容进行重新排序;不过,我可能一两天内都无法查到这一点。我猜这两个答案都是对的,所以我将进入罗宾汉模式,给得分最少的猫打分。如果结果证明他的方式行不通(你的也行不通),我将推翻投票。谢谢@B.ClayShannon——两个答案都应该有效。我的更通用,另一个专门为可以订购的成对钥匙工作。谢谢!请参阅以上我对数据库cat的注释。
checklistboxRVAssistants.Items = RVAssistantsList;
public class Student
{
    public DateTime WeekOfAssignment { get; set; }
    public int TalkType { get; set; }
    public int StudentID_FK { get; set; }
    public int AssistantID_FK { get; set; }
    public int CounselPoint { get; set; }
    public bool HasBeenEmailed { get; set; }
    public bool SlipHasBeenPrinted { get; set; }
}
var result = studentlist.GroupBy(m => new 
                                { 
                                    A = Math.Min(m.StudentID_FK, m.AssistantID_FK),  // This gets pairs like (1, 2) and (2, 1)
                                    B = Math.Max(m.StudentID_FK, m.AssistantID_FK)   // as the same (1, 2)
                                })
                    .OrderBy(g => g.Count())
                    .SelectMany(g => g)
                    .ToList();
        var orderedAssistants = studentlist
            .OrderBy(a => GetCountOfTimesWorkedTogether(studentlist, a.StudentID_FK, a.AssistantID_FK))
            .ToList();
    private static int GetCountOfTimesWorkedTogether(IEnumerable<Student> studentList, int id1, int id2)
    {
        var count = studentList.Where(s => s.StudentID_FK == id1 && s.AssistantID_FK == id2 || s.StudentID_FK == id2 && s.AssistantID_FK == id1).Count();
        return count;
    }
        var orderedAssistants = studentlist
            .GroupBy(s => (new[] { s.AssistantID_FK, s.StudentID_FK }).ToSet(), HashSet<int>.CreateSetComparer())
            .OrderBy(g => g.Count())
            .SelectMany(g => g)
            .ToList();
public static class EnumerableExtensions
{
    public static HashSet<T> ToSet<T>(this IEnumerable<T> source)
    {
        return new HashSet<T>(source);
    }
}