Как инициализировать var вне foreach - PullRequest
0 голосов
/ 01 августа 2011

Я хочу инициализировать var вне цикла foreach.

Вот мой код:

public List<Course> GetCourse()
    {
        IList<Semester> semesters = Semester.Get();     

        foreach (Semester sm in semesters)
        {
            IList<CourseInstance> courseInstances = CourseInstance.Get(sm[0].SemesterId);
            var courseInfos = from c in courseInstances
                                  select new Course { Code = c.Course.Code, Name = c.Course.Name };
        }

        return courseInfos.ToList();
    }

Как инициализировать courseInfos вне цикла foreach?Я пытаюсь инициализировать с нуля, дай мне ошибку!

Ответы [ 5 ]

1 голос
/ 01 августа 2011

var выводит тип из значения, которое вы инициализируете, поэтому инициализация с нуля никогда не будет работать. Все остальное будет.

Я полагаю, что вы хотите написать утверждение Linq

var courses = semesters
    .SelectMany( s => CourseInstance.Get(s.SemesterId)
    .Select( c => new Course ( Code = c.Course.Code, Name = c.Course.Name ) )
    .ToList();
0 голосов
/ 01 августа 2011

может быть эта помощь. Сбор информации о курсе в каждой итерации.

  public List<Course> GetCourse()
        {
        IList<Semester> semesters = Semester.Get();

        List<Course> courseInfos = new List<Course>();
        foreach (Semester sm in semesters)
            {
            IList<CourseInstance> courseInstances = CourseInstance.Get(sm.SemesterId);
            IEnumerable<Course> result = from c in courseInstances
                              select new Course { Code = c.Course.Code , Name = c.Course.Name };
            courseInfos.AddRange(result);
            }

        return courseInfos;
        }
0 голосов
/ 01 августа 2011

РЕДАКТИРОВАТЬ:

Если вы хотите сопоставить SemesterName со списком курсов, я бы рекомендовал словарь.

 semesters.ToDictionary(semester => semester.Name, semester => 
                        semesters.SelectMany(sid => 
                                       CourseInstance.Get(sid.SemesterId))
                        .Select(c => new Course 
                        {Code = c.Course.Code, Name = c.Course.Name}).ToList())

Это создаст Dictionary<string, List<Course> Это почти идентичнокод ниже, за исключением того, что он сопоставляет semester.Name в качестве ключа.Это, конечно, означает, что вы должны иметь уникальные имена семестров, иначе словарь не может быть создан.


Вы повторно инициализируете courseInfos каждый раз, когда выполняете цикл в foreach, так что вы получите толькосписок последнего semesterId.

Вы можете написать запрос linq, который сделает все это в одной строке для вас.

return semesters.SelectMany(sid => CourseInstance.Get(sid.SemesterId))
                           .Select(c => new Course { Code = c.Course.Code, 
                                           Name = c.Course.Name }).ToList()

Чтобы разбить его,

.SelectMany(sid => CourseInstance.Get(sid.SemesterId)) 

делает то же самое, что и foreach.Он вернет IEnumerable<CourseInstance>.

После этого вы звоните

 .Select(c => new Course { Code = c.Course.Code, Name = c.Course.Name }) 

на результат, который мы получили в последнем разделе;он возвращает IEnumerable<Course>, который вы превращаете в список.

SelectMany работает аналогично Select, за исключением того, что он будет брать каждый IEnumerable<Course> и объединять его в одну последовательность вместо IEnumerable<IEnumerable<Course>>

0 голосов
/ 01 августа 2011

Почему бы просто не инициализировать первый экземпляр courseInfo первым семестром, а затем выполнить итерации по семестрам, есть ли причина, по которой вам нужно инициализировать courseInfo перед foreeach?

0 голосов
/ 01 августа 2011

Ответ:

IEnumerable<Course> courseInfos = null;

foreach (Semester sm in semesters)
{
    IList<CourseInstance> courseInstances = CourseInstance.Get(semesters[0].SemesterId);
    courseInfos = from c in courseInstances
                  select new Course { Code = c.Course.Code, Name = c.Course.Name };
}
return courseInfos.ToList();

Однако вы отбрасываете все, кроме последней итерации foreach. Это то, что ты хотел сделать?

...