C# 迭代问题-追加开始和结束html
我试图弄清楚如何在这里只附加开始和结束div和ul。我不知道如何将ParentName的下一个字符串与当前字符串进行比较: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++)
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;
}
}