Найти общие элементы в списке списков типа пользователя - PullRequest
0 голосов
/ 18 мая 2018

У меня есть studyTimeList, который содержит списки ScheduleStudyTime - мой тип пользователя.Я пытаюсь найти общий ScheduleStudyTime среди списков.Вот мой код:

    private class ScheduleStudyTime
    {
        public int STUDTIME_ID { get; set; }

        public int DAY_ID { get; set; }

        public int LESSTIME_ID { get; set; }

        public int SCHOOLYEAR_ID { get; set; }
    }

    private void LoadStudyTime()
    {
        var fourths = dbContext.FOURTH.Where(x => x.CHOOSE_SCHEDULE_FOURTH.Any(a => a.SCHEDVARIANT_ID == ScheduleVariant.SCHEDVARIANT_ID)).ToList();
        int fourthCount = fourths != null ? fourths.Count() : 0;
        List<ScheduleStudyTime>[] studyTimeList = new List<ScheduleStudyTime>[fourthCount];
        for (int i = 0; i <= (fourthCount - 1); ++i)
        {
            int fourthId = fourths[i].FOURTH_ID;
            var chooseStudyTime = from CHOOSE_STUDY_FOURTH in dbContext.CHOOSE_STUDY_FOURTH
                                  where CHOOSE_STUDY_FOURTH.STUDY_TIME.SCHOOLYEAR_ID == Properties.Settings.Default.SchoolYearId &&
                                  CHOOSE_STUDY_FOURTH.FOURTH_ID == fourthId
                                  group CHOOSE_STUDY_FOURTH by new
                                  {
                                      CHOOSE_STUDY_FOURTH.STUDY_TIME.STUDTIME_ID,
                                      CHOOSE_STUDY_FOURTH.STUDY_TIME.DAY_ID,
                                      CHOOSE_STUDY_FOURTH.STUDY_TIME.LESSTIME_ID,
                                      CHOOSE_STUDY_FOURTH.STUDY_TIME.SCHOOLYEAR_ID
                                  }
                                  into gcsf
                                  select new ScheduleStudyTime
                                  {
                                      STUDTIME_ID = gcsf.Key.STUDTIME_ID,
                                      DAY_ID = gcsf.Key.DAY_ID,
                                      LESSTIME_ID = gcsf.Key.LESSTIME_ID,
                                      SCHOOLYEAR_ID = gcsf.Key.SCHOOLYEAR_ID
                                  };
            studyTimeList[i] = chooseStudyTime.ToList();
        }
        var commonStudyTime = studyTimeList.Aggregate((xs, ys) => xs.Intersect(ys).ToList());
    }

Как я могу это сделать, если commonStudyTime возвращает ноль, даже если есть совпадения

1 Ответ

0 голосов
/ 18 мая 2018

Метод Intersect будет использовать компаратор по умолчанию, который в основном проверяет (для ссылочных типов), совпадают ли ссылки.Поскольку в вашем списке есть object типы, и они являются различными объектами, он возвращает 0 результатов.

Чтобы сделать то, что вы хотите, вы должны указать методу Intersect, как выполнить проверку сравнения.Таким образом, вам нужно что-то вроде:

public class ScheduleStudyTimeComparer : IEqualityComparer<ScheduleStudyTime>
{
    public bool Equals(ScheduleStudyTime x, ScheduleStudyTime y)
    {
        // TODO: Check for nulls and possibly make the decision using
        // other properties as well
        return x.STUDTIME_ID  == y.STUDTIME_ID ;
    }

    public int GetHashCode(ScheduleStudyTime obj)
    {
        return obj.ScheduleStudyTime.GetHashCode();
    }
}

Теперь скажите Intersect метод, чтобы использовать это:

xs.Intersect(ys, new ScheduleStudyTimeComparer())
...