我经常发现自己用需要CSS类设置的项目来填充ASP.NET转发器,这取决于索引:索引为“first”,索引(length-1)为“last”,中间为“mid”:
_repeater.DataSource = from f in foos
select new
{
...,
CssClass = MakeCssClass( foos, f )
};
private static string MakeCssClass( Foo[] foos, Foo f )
{
var index = Array.IndexOf( foos, f );
if( index == 0 )
{
return "first";
}
else if( index == foos.Length - 1 )
{
return "last";
}
else
{
return "mid";
}
}
有没有更好的方法可以实现这一点(例如使用lambda函数)?如果我尝试获取CS0828,“无法将lambda表达式分配给匿名类型属性”。
答案 0 :(得分:4)
您可能会对SmartEnumerable中的MiscUtil类型感兴趣。
从使用情况页面,有一个例子:
using System;
using System.Collections.Generic;
using MiscUtil.Collections;
class Example
{
static void Main(string[] args)
{
List<string> list = new List<string>();
list.Add("a");
list.Add("b");
list.Add("c");
list.Add("d");
list.Add("e");
foreach (SmartEnumerable<string>.Entry entry in
new SmartEnumerable<string>(list))
{
Console.WriteLine ("{0,-7} {1} ({2}) {3}",
entry.IsLast ? "Last ->" : "",
entry.Value,
entry.Index,
entry.IsFirst ? "<- First" : "");
}
}
}
使用隐式类型变量和更多类型推断,语法可以很容易地整理。我必须在那段时间内完成,但基础知识已经存在。
答案 1 :(得分:0)
这是获取这些中频的一种聪明方法 - 跳过,反向,跳过(这是什么,UNO?)。
List<SomeClass> myList = foos
.Select(f => new SomeClass{ ..., CssClass=string.Empty })
.ToList();
if (myList.Any())
{
myList.First().CssClass = "first";
myList.Last().CssClass = "last";
foreach(var z in myList.Skip(1).Reverse().Skip(1))
{
z.CssClass = "mid";
}
}
_repeater.DataSource = myList;
这是此问题陈述的更好方法。
List<SomeClass> myList = foos
.Select(f => new SomeClass{ ..., CssClass="mid" })
.ToList();
if (myList.Any())
{
myList.First().CssClass = "first";
myList.Last().CssClass = "last";
}
_repeater.DataSource = myList;
当然,如果您使用匿名类型(它们的属性是只读的),这些技术都不会起作用。不要对查询结果使用匿名类型。