【发布时间】:2016-03-04 20:12:32
【问题描述】:
有了这样的数据(作为旁注,json 文件中的这些单独的组件被正确地称为什么 - 记录?项目?元素?对象?jsonpiecesparts?):
[
{
"WeekOfAssignment": "2016-04-04T00:00:00",
"TalkType": 1,
"StudentID_FK": 32,
"AssistantID_FK": 0,
"CounselPoint": 10,
"HasBeenEmailed": false,
"SlipHasBeenPrinted": false
},
{
"WeekOfAssignment": "2016-04-11T00:00:00",
"TalkType": 1,
"StudentID_FK": 43,
"AssistantID_FK": 0,
"CounselPoint": 39,
"HasBeenEmailed": false,
"SlipHasBeenPrinted": false
},
{
"WeekOfAssignment": "2016-04-11T00:00:00",
"TalkType": 2,
"StudentID_FK": 44,
"AssistantID_FK": 40,
"CounselPoint": 12,
"HasBeenEmailed": false,
"SlipHasBeenPrinted": false
},
{
"WeekOfAssignment": "2016-04-11T00:00:00",
"TalkType": 4,
"StudentID_FK": 4,
"AssistantID_FK": 24,
"CounselPoint": 23,
"HasBeenEmailed": false,
"SlipHasBeenPrinted": false
},
{
"WeekOfAssignment": "2016-04-11T00:00:00",
"TalkType": 6,
"StudentID_FK": 1,
"AssistantID_FK": 41,
"CounselPoint": 42,
"HasBeenEmailed": false,
"SlipHasBeenPrinted": false
},
{
"WeekOfAssignment": "2016-04-25T00:00:00",
"TalkType": 1,
"StudentID_FK": 19,
"AssistantID_FK": 0,
"CounselPoint": 2,
"HasBeenEmailed": false,
"SlipHasBeenPrinted": false
},
{
"WeekOfAssignment": "2016-04-25T00:00:00",
"TalkType": 2,
"StudentID_FK": 13,
"AssistantID_FK": 12,
"CounselPoint": 41,
"HasBeenEmailed": false,
"SlipHasBeenPrinted": false
},
{
"WeekOfAssignment": "2016-04-25T00:00:00",
"TalkType": 4,
"StudentID_FK": 20,
"AssistantID_FK": 42,
"CounselPoint": 11,
"HasBeenEmailed": false,
"SlipHasBeenPrinted": false
},
{
"WeekOfAssignment": "2016-04-25T00:00:00",
"TalkType": 6,
"StudentID_FK": 36,
"AssistantID_FK": 39,
"CounselPoint": 31,
"HasBeenEmailed": false,
"SlipHasBeenPrinted": false
}
]
...我想根据 StudentID_FK 与 AssistantID_FK 一起工作的次数来对这些对象(或它们所称的任何东西)进行排序,其中将两者一起分配的次数最少位于列表顶部。 IOW,从未一起分配的两个应该是有序列表中的第一项,而那些一起分配次数最多的应该在底部。
注意:曾经显示为“StudentID_FK”的人下一次可能会显示为“AssistantID_FK”,反之亦然。
要确定这一点,需要查询整个 json 文件。我相信我可以得到这样的计数(假设 studentlist 是一个学生列表,如 json 文件中所示):
int countOfTimesWorkedTogether = GetCountOfTimesWorkedTogether(student1, student2);
private int GetCountOfTimesWorkedTogether(int student, int assistant)
{
int StudentAndAssistant = studentlist.Where(s => s.StudentID_FK == student && a => a.AssistantID_FK == assistant).Count();
int AssistantAndStudent = studentlist.Where(s => s.StudentID_FK == assistant && a => a.AssistantID_FK == student).Count();
return StudentAndAssistant + AssistantAndStudent;
}
...但是我将如何在列表的 LINQ 查询中使用它?计数不是学生类的成员,那么可以使用什么“技巧”根据这些计数对结果进行排序?
我需要的是来自同一个列表的两个并排排序。第一个由 WeekOfAssignment 排序,“旁边”包含其他人的列表,按他们与当前在第一个查询填充的选中列表框中突出显示的人一起工作的最少次数排序。
在伪代码中,我最终需要的是:
List<Student> orderedStudents = studentlist.OrderBy(WeekOfAssignment);
这会填充 checklistboxStudents。
然后这个:
List<Student> orderedAssistants = studentlist.OrderBy(CountOfTimesWorkedWithSelectedPersonInChecklistboxStudents);
...填充checklistboxAssistants;因此,每次在 checklistboxStudents 中选择不同的学生时,都必须重新运行第二个查询,并对 checklistboxAssistants 重新排序。
更新
恐怕我没有解释清楚这个问题的真正本质。它是:
每周有许多 (3) 项作业,每人需要两名学生:“那个”学生和一名助理。
每个学生都可以扮演任何角色;他们可以讲 2、3、4、5、6 或 7。偶数是学生作业,奇数是助理作业。每个列表都是唯一的 - 那些接下来会被分配到 #2 的列表,接下来会被分配到 #3 的列表,等等。
因此,这六个列表中的每一个都是学生超集列表的唯一子集,在任何给定的一周内,每个列表中的总人数大约为 1/6(他们在下周移至下一个列表)。
所以我需要将列表 3 中的内容与列表 2 中的内容进行比较,将列表 5 中的内容与列表 4 中的内容进行比较,将列表 7 中的内容与列表 6 中的内容进行比较。
有一个学生列表,用于跟踪学生数据,例如给出的最后一个作业(#/talk 类型和日期)等。作业列表(上面显示的摘录)包含每个作业/周,“那个”学生的学生 (StudentID_FK),以及那个时候的助理学生 (AssistantID_FK)。
所以,重新考虑一下,我也许可以像这样(伪代码)命令助手:
0) 向 Student 类添加一个“OptionalOrderingVal”成员:
public int OptionalOrderingVal { get; set; }
首先,根据下一个任务类型获取初始助手列表,按最后任务日期排序;例如,对于作业#3,它支持#2:
var RVAssistantsList = studentlist.Where(t => t.talkType == 3).OrderBy(w => weekOfLastAssignment);
接下来,创建该子列表的新版本,填充 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;
我可以称之为 kludgelent 或 eligy; YMMV。
【问题讨论】:
-
我认为您的计数需要处理
student == assistant假设这是可能的情况。 -
不,学生和助手永远不会在一个对象中相同。
-
如果两个没有分配在一起,你想如何查找?我的意思是名单是由那些已经被分配在一起的学生组成的,可能还有其他一些没有被分配的学生,因此他们的名字不在名单中。
-
@user3473830:所有下一个作业是作为相关谈话类型的助理的学生都在第二个复选框中,按上次作业的时间排序;如果他们还没有,他们将在列表的顶部。然后,当在第一个(学生)复选框中选择了一个学生时,我想根据他们被分配与学生一起工作的时间来重新排序助手复选框的内容。
标签: c# json linq generic-list