在IEnumerable循环中获取当前的索引+值

时间:2009-08-10 08:11:46

标签: c# ienumerable

我有一个循环,我需要使用2 IEnumerable中的值,我需要获取“标签”的当前索引和值,因此我可以为每个标签打印出labelname。

public static string CheckBoxList(this HtmlHelper htmlhelper, IEnumerable<string> values, IEnumerable<string> labels, string name, IDictionary<string, object> HtmlAttributes)
    {
        if (labels == null)
            return "";

        StringBuilder sb = new StringBuilder();


        string[] modelValues = new string[] {};

        ModelState modelState;

        if(htmlhelper.ViewData.ModelState.TryGetValue(name, out modelState)) {
            modelValues = ((string[])modelState.Value.RawValue);
        }


        foreach(string s in values)
        {
            bool isChecked = modelValues.Contains(s);

            sb.Append(CreateCheckBox(name, s, isChecked, HtmlAttributes));

            sb.Append(" <label for=\"" + name + "\"> " + labels + "</label><br />");
        }


        return sb.ToString();
    }

如何在该循环中打印出“标签”的当前值?另外我需要“索引”,需要为复选框建立一个唯一的ID,这样标签才能正常工作。

提前致谢。 / M

2 个答案:

答案 0 :(得分:2)

我假设值和标签包含相同数量的值,并且它们以第一个值对应于第一个标签的方式排序,依此类推。如果是这种情况,您可以为每个IEnumerable<string>对象获取一个枚举器,并使用枚举器迭代集合。此外,您可以添加一个为每次迭代递增的int变量,并将其用于创建唯一ID:

public static string CheckBoxList(this HtmlHelper htmlhelper, IEnumerable<string> values, IEnumerable<string> labels, string name, IDictionary<string, object> HtmlAttributes)
{
    if (labels == null)
        return "";

    StringBuilder sb = new StringBuilder();
    string[] modelValues = new string[] { };
    ModelState modelState;

    if (htmlhelper.ViewData.ModelState.TryGetValue(name, out modelState))
    {
        modelValues = ((string[])modelState.Value.RawValue);
    }

    IEnumerator<string> valueEnumerator = values.GetEnumerator();
    IEnumerator<string> labelEnumerator = labels.GetEnumerator();
    int index = 0;
    while (valueEnumerator.MoveNext() && labelEnumerator.MoveNext())
    {
        bool isChecked = modelValues.Contains(valueEnumerator.Current);
        sb.Append(CreateCheckBox(name, valueEnumerator.Current, isChecked, HtmlAttributes));
        sb.Append(string.Format(" <label for=\"{0}\" id=\"label-{1}\">{2}</label></br>", name, index, labelEnumerator.Current);
        index++;
    }

    return sb.ToString();
}

答案 1 :(得分:0)

如果你想使用foreach循环,那么你需要这样的东西:

int i = 0;
foreach (string s in values) {
    bool isChecked = modelValues.Contains(s);
    sb.Append(CreateCheckBox(name, s, isChecked, HtmlAttributes));
    sb.Append(" <label for=\"" + name + "\"> " + labels.ElementAt(i) + "</label><br />");
    i++;
}

然而,在这种情况下,for循环可能更好

// IEnumerable doesn't have Count property so you need to use Count() 
// extension method from System.Linq namespace.
int length = values.Count();
for (int i = 0; i < length; i++) {
    bool isChecked = modelValues.Contains(values.ElementAt(i));
    sb.Append(CreateCheckBox(name, values.ElementAt(i), isChecked, HtmlAttributes));
    sb.Append(" <label for=\"" + name + "\"> " + labels.ElementAt(i) + "</label><br />");
}