在 C# / LINQ 中是否有更好/内联的方法来完成以下任务?
我经常发现自己在 ASP.NET 中继器中填充需要根据索引设置 CSS 类的项目:“first”表示索引 0,“last”表示索引(length-1),“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 表达式分配给匿名类型属性”。
Often I find myself filling ASP.NET repeaters with items that need the CSS class set depending on index: 'first' for index 0, 'last' for index (length-1), and 'mid' in the middle:
_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";
}
}
Is there a nicer way I can achieve this (eg using lambda functions)? If I try I get CS0828, "Cannot assign lambda expression to anonymous type property".
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是获得这些中频的巧妙方法 - 跳过、反向、跳过(这是什么,UNO?)。
这是这个问题陈述的更好方法。
当然,如果您使用匿名类型(它们的属性是只读的),这些技术都不起作用。 不要对查询结果使用匿名类型。
Here's a clever way to get those mids - Skip, Reverse, Skip (what is this, UNO?).
Here's a better way for this problem statement.
Of course, neither of these technique will work if you are using anonymous types (their properties are read-only). Don't use anonymous types for query results.
您可能对我在 SmartEnumerable 类型感兴趣="http://pobox.com/~skeet/csharp/miscutil" rel="nofollow noreferrer">MiscUtil。
在使用页面中,有一个示例:
使用隐式类型变量和更多类型推断,可以很容易地整理语法。 我必须抽出时间来讨论这个问题,但基础知识已经存在了。
You might be interested in my SmartEnumerable type in MiscUtil.
From the usage page, there's an example:
With implicitly typed variables and a bit more type inference the syntax could be tidied up quite easily. I must get round to that some time, but the basics are already there.