Получение индекса + значение для тока в цикле IEnumerable - PullRequest
0 голосов
/ 10 августа 2009

У меня есть цикл, в котором мне нужно использовать значения из 2 IEnumerable, и мне нужно получить текущий индекс и значение для «меток», чтобы я мог распечатать имя метки для каждого из них.

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();
    }

Как мне распечатать текущее значение для "меток" в этом цикле? Также мне нужен "индекс", нужно создать уникальный идентификатор для флажка, чтобы метка работала.

Спасибо заранее. / M

Ответы [ 2 ]

2 голосов
/ 10 августа 2009

Я предполагаю, что значения и метки содержат одинаковое количество значений и что они отсортированы таким образом, что первое значение соответствует первой метке и т. Д. Если это так, вы, вероятно, можете получить перечислитель для каждого из IEnumerable<string> объектов и перебрать коллекции, используя перечислители. Также вы можете добавить переменную int, которую вы увеличиваете для каждой итерации, и использовать ее для создания уникальных идентификаторов:

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();
}
0 голосов
/ 10 августа 2009

Если вы хотите использовать цикл 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 />");
}
...