C# 在c中使用两种类型的条件的foreach#

C# 在c中使用两种类型的条件的foreach#,c#,foreach,C#,Foreach,我使用下拉菜单进行搜索。文本值应与值不同。因此,我创建了两种类型的方法: List<string> lstRoles = new List<string>(); lstRoles = _repository.GetRolesForFindJobseekers(); List<string> lstFunctions = new List<string>(); lstFunctions = _repository.Ge

我使用下拉菜单进行搜索。文本值应与值不同。因此,我创建了两种类型的方法:

    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;
List lstRoles=new List();
lstRoles=_repository.GetRolesForFindJobseekers();
列表函数=新列表();
lstFunctions=_repository.getFunctionsforolesFindJobseekers();
List selectListRoles=新建列表();
int i=1;
foreach(lstRoles中的字符串角色)
{
selectListRoles.Add(新建SelectListItem)
{
文本=角色,
价值=角色,
所选=(i==0)
});
i++;
}
ViewData[“求职者的角色”]=selectListRoles;

lst函数
应位于值字段中。我将如何添加它?

您可以使用枚举数同时迭代两个列表,而不是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++;
}

您可以使用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;
怎么样

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;

您可以先将这两个列表合并为一个列表,然后在该列表上循环

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++;
}

也许你可以使用一个KeyValuePair列表,其中key是角色,value是函数?你如何知道哪个“角色”与哪个“函数”相匹配?这取决于你如何使用你的角色求职者查看数据,如果你正在使用的某个框架需要,请将其命名,以便其他人可以提供帮助,或者查阅it文档。这不仅仅是如何使用该框架,而不是c#foreachi如果你问如何并行迭代两个列表,请参见。你应该对枚举数使用
using
。+1我的想法,但更快。源可枚举项根本不需要是list.Ta。最好是列表或数组。这可以确保枚举执行一次,从而不会产生副作用。根据代码的其余部分,请避免多次枚举。在查询中关闭外部变量不是一个好主意。如果多次执行查询,您会得到错误的结果。@Enigmativity,我同意,这是一种肮脏且浪费的黑客行为。现在这是一种更好的解决方案。我喜欢。