Я использовал выпадающий список для поиска. Текстовое значение должно отличаться от значения. Итак, я создал 2 типа методов:

    List<string> lstRoles = new List<string>();
    lstRoles = _repository.GetRolesForFindJobseekers();
    List<string> lstFunctions = new List<string>();
    lstFunctions = _repository.GetFunctionsForRolesFindJobSeekers();


    List<SelectListItem> selectListRoles = new List<SelectListItem>();

    int i = 1;
    foreach (string role in lstRoles)
    {

            selectListRoles.Add(new SelectListItem
            {
                Text = role,
                Value = role,
                Selected = (i == 0)
            });

            i++;

    }
    ViewData["RolesForJobSeekers"] = selectListRoles;

lstFunctions должен входить в поле значения. Как мне это добавить?

5
PoliDev 10 Мар 2014 в 13:20
Может быть, вы можете использовать список KeyValuePair, где ключ — это роль, а значение — это функция?
 – 
mcy
10 Мар 2014 в 13:27
3
Как узнать, какая «роль» соответствует какой «функции»?
 – 
Eren Ersönmez
10 Мар 2014 в 13:28
Это зависит от того, как вы используете данные представления RolesForJobSeekers, если это требуется какой-либо используемой вами инфраструктурой, назовите ее, чтобы другие могли помочь, или обратитесь к документации. Это больше, чем то, как использовать этот фреймворк, чем C# foreach.
 – 
Russell Yan
10 Мар 2014 в 13:32
Если вы спрашиваете, как параллельно перебирать два списка, см. этот ответ.
 – 
Eren Ersönmez
10 Мар 2014 в 13:38

4 ответа

Лучший ответ

Вы можете сначала объединить эти 2 списка в один, а затем перебрать этот список.

var lstCombined =
    lstRoles
     .Zip(lstFunctions, (role, function) => new {Role = role, Function = function}).ToList();

int i = 1;

foreach (var item in lstCombined)
{
    selectListRoles.Add(new SelectListItem
                            {
                                Text = item.Role,
                                Value = item.Function,
                                Selected = (i == 0)
                            });

    i++;
}
2
Wasif Hossain 10 Мар 2014 в 13:44

Как насчет

var selectListRoles = _repository.GetRolesForFindJobseekers().Zip(
    _repository.GetFunctionsForRolesFindJobSeekers(),
    (role, function) => new SelectListItem
        {
            Text = role,
            Value = function,
            Selected = false
        }).ToList();
selectListRoles[0].Selected = true;
ViewData["RolesForJobSeekers"] = selectListRoles;

Если вы не хотели создавать экземпляр selectListRoles

// If you know selectListRoles starts empty, use 0 instead of baseIndex.
var baseIndex = selectListRoles.Count;
selectListRoles.AddRange(_repository.GetRolesForFindJobseekers().Zip(
    _repository.GetFunctionsForRolesFindJobSeekers(),
    (role, function) => new SelectListItem
        {
            Text = role,
            Value = function,
            Selected = false
        }));
selectListRoles[baseIndex].Selected = true;
2
Jodrell 10 Мар 2014 в 14:30
2
Плохая идея закрывать внешнюю переменную в запросе. Вы получите неправильные результаты, если запрос выполняется несколько раз.
 – 
Enigmativity
10 Мар 2014 в 13:44
@Enigmativity, я согласен, это грязный и расточительный взлом.
 – 
Jodrell
10 Мар 2014 в 13:48
Теперь это лучшее решение для этой ситуации. Мне это нравится.
 – 
Enigmativity
10 Мар 2014 в 13:48

Вместо foreach вы можете использовать счетчики для одновременного перебора двух списков.

IEnumerator enum1 = lstRoles.GetEnumerator();
IEnumerator enum2 = lstFunctions.GetEnumerator();

int i = 1;
while ((enum1.MoveNext()) && (enum2.MoveNext()))
{
        selectListRoles.Add(new SelectListItem
        {
            Text = enum1.Current,
            Value = enum2.Current,
            Selected = (i == 0)
        });

        i++;
}
3
Geoffroy 10 Мар 2014 в 13:30
3
Вы должны использовать using для перечислителей.
 – 
Eren Ersönmez
10 Мар 2014 в 13:34

Вы можете использовать linq и сделать это одним запросом:

var selectListRoles =
    lstRoles
        .Zip(lstFunctions, (role, function) => new { role, function })
        .Select((rf, i) => new SelectListItem()
        {
            Text = rf.role,
            Value = rf.function,
            Selected = (i + 1 == 0),
        })
        .ToList();

ViewData["RolesForJobSeekers"] = selectListRoles;
4
Enigmativity 10 Мар 2014 в 13:35
+1 моя идея, но раньше. Исходные перечисления вообще не обязательно должны быть списками.
 – 
Jodrell
10 Мар 2014 в 13:38
Та. Лучше, если они будут списком или массивом. Это гарантирует, что перечисляемое выполняется один раз, чтобы вы не получили побочных эффектов.
 – 
Enigmativity
10 Мар 2014 в 13:45
Зависит от остальной части кода, избегайте множественных перечислений.
 – 
Jodrell
10 Мар 2014 в 13:50