C# 迭代问题-追加开始和结束html

C# 迭代问题-追加开始和结束html,c#,C#,我试图弄清楚如何在这里只附加开始和结束div和ul。我不知道如何将ParentName的下一个字符串与当前字符串进行比较: foreach (SList subList in parentList) { if (subList.SubList.Count < 1) return string.Empty; for(int i = 0; i < subList.SubList.Count; i++)

我试图弄清楚如何在这里只附加开始和结束div和ul。我不知道如何将ParentName的下一个字符串与当前字符串进行比较:

    foreach (SList subList in parentList)
    {
        if (subList.SubList.Count < 1)
            return string.Empty;

        for(int i = 0; i < subList.SubList.Count; i++)
        {
            if (string.Compare(subList.PName, lastPName) != 0)
            {
                subListItemsToHtml.AppendFormat(@"<div id='{0}-test' class='dropdown'>", subList.SubList[i].PName);
                subListItemsToHtml.Append("<ul>");
            }

            subListItemsToHtml.AppendFormat(@"    <li><a href='{0}'>{1}</a></li>", subList.SubList[i].URL, subList.SubList[i].DisplayName);
            lastPName = subList.SubList[i].PName;

            if (i + 1 < subList.SubList.Count)
                if(string.Compare(subList.SubList[i].PName, subList.SubList[i+1].PName) != 0)
                    subListItemsToHtml.Append("</ul></div>");
        }
    }


    return subListItemsToHtml.ToString();
}
foreach(父列表中的SList子列表)
{
if(subList.subList.Count<1)
返回字符串。空;
for(int i=0;i”);
}
subListItemsToHtml.AppendFormat(@“
  • ”,subList.subList[i].URL,subList.subList[i].DisplayName); lastPName=subList.subList[i].PName; if(i+1<子列表.子列表.计数) if(string.Compare(subList.subList[i].PName,subList.subList[i+1].PName)!=0) subistitemstohtml.Append(“”); } } 返回subListItemsToHtml.ToString(); }
    我不知道数据的结构是否与标记的结构匹配,但如果数据的结构与标记的结构匹配,则更改为这样似乎是合乎逻辑的:

    foreach (SList subList in parentList)
    {
        if (subList.SubList.Count < 1)
            return string.Empty;
    
        subListItemsToHtml.AppendFormat(@"<div id='{0}-test' class='dropdown'>", subList.SubList[i].PName);
        subListItemsToHtml.Append("<ul>");
    
        for(int i = 0; i < subList.SubList.Count; i++)
        {
            subListItemsToHtml.AppendFormat(@"    <li><a href='{0}'>{1}</a></li>", subList.SubList[i].URL, subList.SubList[i].DisplayName);
            lastPName = subList.SubList[i].PName;
        }
    
        subListItemsToHtml.Append("</ul></div>");
    }
    
    return subListItemsToHtml.ToString();
    

    尝试按如下方式重构代码:

    foreach (SList subList in parentList)
    {
        if (subList.SubList.Count < 1)
            return string.Empty;
    
        for(int i = 0; i < subList.SubList.Count; i++)
        {
            if (string.Compare(subList.PName, lastPName) != 0)
            {
                subListItemsToHtml.AppendFormat(@"<div id='{0}-test' class='dropdown'>", subList.SubList[i].PName);
                subListItemsToHtml.Append("<ul>");
    
                subListItemsToHtml.AppendFormat(@"    <li><a href='{0}'>{1}</a></li>", subList.SubList[i].URL, subList.SubList[i].DisplayName);
                subListItemsToHtml.Append("</ul></div>");
            }
            else
            {
                subListItemsToHtml.AppendFormat(@"    <li><a href='{0}'>{1}</a></li>", subList.SubList[i].URL, subList.SubList[i].DisplayName);
            }
            lastPName = subList.SubList[i].PName;
        }
    }
    
    foreach(父列表中的SList子列表)
    {
    if(subList.subList.Count<1)
    返回字符串。空;
    for(int i=0;i”);
    subListItemsToHtml.AppendFormat(@“
  • ”,subList.subList[i].URL,subList.subList[i].DisplayName); subistitemstohtml.Append(“”); } 其他的 { subListItemsToHtml.AppendFormat(@“
  • ”,subList.subList[i].URL,subList.subList[i].DisplayName); } lastPName=subList.subList[i].PName; } }
    关于你的问题,有一件事我不确定,那就是是否存在子列表的子列表

    看起来你的结构是这样的:

    public class Parent : List<SList>
    { }
    
    public class SList
    {
        public List<SList> SubList = new List<SList>();
        public string PName;
        public string URL;
        public string DisplayName;
    }
    
    然后,我做以下工作:

    var html = String.Join(Environment.NewLine,
        sublists
            .AdjacentBy(
                sl => sl.PName,
                sls => String.Format(@"<div id='{0}-test' class='dropdown'><ul>",
                    sls.First().PName),
                sl => String.Format(@"<li><a href='{0}'>{1}</a></li>",
                    sl.URL,
                    sl.DisplayName),
                sls => @"</ul></div>")
            .SelectMany(x => x));
    
    它的工作是在
    键选择器产生的值发生变化时,获取一个列表并列出列表。列表列表中的值来自
    valueSelector

    可以使用
    标题选择器
    页脚选择器
    lambdas根据当前列表中的项目创建页眉值和页脚值

    例如,如果我运行此查询:

    var query = "CBBCCA"
        .AdjacentBy(
            c => c,
            cs => cs.Count().ToString() + "x",
            c => c.ToString(),
            cs => ".")
        .ToArray();
    
    这相当于:

    var query = new []
    {
        new [] { "1x", "C", "." },
        new [] { "2x", "B", "B", "." },
        new [] { "2x", "C", "C", "." },
        new [] { "1x", "A", "." },
    };
    
    以下是
    邻接词的完整定义:

    public static IEnumerable<IEnumerable<V>> AdjacentBy<T, K, V>(
        this IEnumerable<T> source,
        Func<T, K> keySelector,
        Func<IEnumerable<T>, V> headerSelector,
        Func<T, V> valueSelector,
        Func<IEnumerable<T>, V> footerSelector)
    {
        var first = true;
        var last = default(K);
        var list = new List<T>();
        var values = (IEnumerable<V>)null;
        Func<List<T>, IEnumerable<V>> getValues = ts =>
        {
            var vs = (IEnumerable<V>)null;
            if (ts.Count > 0)
            {
                IEnumerable<V> hs = headerSelector == null
                    ? Enumerable.Empty<V>()
                    : new [] { headerSelector(ts) };
                IEnumerable<V> fs = footerSelector == null
                    ? Enumerable.Empty<V>()
                    : new [] { footerSelector(ts) };
                vs = hs
                    .Concat(ts.Select(t => valueSelector(t)))
                    .Concat(fs)
                    .ToArray();
            }
            return vs;
        };
        foreach (var t in source)
        {
            var current = keySelector(t);
            if (first || !current.Equals(last))
            {
                first = false;
                values = getValues(list);
                if (values != null)
                {
                    yield return values;
                }
                list.Clear();
                last = current;
            }
            list.Add(t);
        }
        values = getValues(list);
        if (values != null)
        {
            yield return values;
        }
    }
    
    公共静态IEnumerable邻接项(
    这是一个数不清的来源,
    Func键选择器,
    Func校长选举人,
    Func值选择器,
    Func页脚选择器)
    {
    var first=真;
    var last=默认值(K);
    var list=新列表();
    var值=(IEnumerable)null;
    Func getValues=ts=>
    {
    var vs=(IEnumerable)null;
    如果(ts.Count>0)
    {
    IEnumerable hs=headerSelector==null
    ?可枚举。空()
    :新[]{校长选举人(ts)};
    IEnumerable fs=footerSelector==null
    ?可枚举。空()
    :新[]{footerSelector(ts)};
    vs=hs
    .Concat(ts.Select(t=>valueSelector(t)))
    康卡特先生(财政司司长)
    .ToArray();
    }
    回报vs;
    };
    foreach(源中的var t)
    {
    无功电流=选键器(t);
    如果(第一个| |!当前.等于(最后一个))
    {
    第一个=假;
    值=获取值(列表);
    如果(值!=null)
    {
    收益回报值;
    }
    list.Clear();
    last=当前值;
    }
    列表。添加(t);
    }
    值=获取值(列表);
    如果(值!=null)
    {
    收益回报值;
    }
    }
    

    我希望这能有所帮助。

    你能发布一个
    家长列表的样本吗?
    
    IEnumerable<IEnumerable<V>> AdjacentBy<T, K, V>(
        this IEnumerable<T> source,
        Func<T, K> keySelector,
        Func<IEnumerable<T>, V> headerSelector,
        Func<T, V> valueSelector,
        Func<IEnumerable<T>, V> footerSelector)
    
    var query = "CBBCCA"
        .AdjacentBy(
            c => c,
            cs => cs.Count().ToString() + "x",
            c => c.ToString(),
            cs => ".")
        .ToArray();
    
    var query = new []
    {
        new [] { "1x", "C", "." },
        new [] { "2x", "B", "B", "." },
        new [] { "2x", "C", "C", "." },
        new [] { "1x", "A", "." },
    };
    
    public static IEnumerable<IEnumerable<V>> AdjacentBy<T, K, V>(
        this IEnumerable<T> source,
        Func<T, K> keySelector,
        Func<IEnumerable<T>, V> headerSelector,
        Func<T, V> valueSelector,
        Func<IEnumerable<T>, V> footerSelector)
    {
        var first = true;
        var last = default(K);
        var list = new List<T>();
        var values = (IEnumerable<V>)null;
        Func<List<T>, IEnumerable<V>> getValues = ts =>
        {
            var vs = (IEnumerable<V>)null;
            if (ts.Count > 0)
            {
                IEnumerable<V> hs = headerSelector == null
                    ? Enumerable.Empty<V>()
                    : new [] { headerSelector(ts) };
                IEnumerable<V> fs = footerSelector == null
                    ? Enumerable.Empty<V>()
                    : new [] { footerSelector(ts) };
                vs = hs
                    .Concat(ts.Select(t => valueSelector(t)))
                    .Concat(fs)
                    .ToArray();
            }
            return vs;
        };
        foreach (var t in source)
        {
            var current = keySelector(t);
            if (first || !current.Equals(last))
            {
                first = false;
                values = getValues(list);
                if (values != null)
                {
                    yield return values;
                }
                list.Clear();
                last = current;
            }
            list.Add(t);
        }
        values = getValues(list);
        if (values != null)
        {
            yield return values;
        }
    }