在 C# / LINQ 中是否有更好/内联的方法来完成以下任务?

发布于 2024-07-13 07:50:33 字数 668 浏览 4 评论 0原文

我经常发现自己在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

坐在坟头思考人生 2024-07-20 07:50:36

这是获得这些中频的巧妙方法 - 跳过、反向、跳过(这是什么,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;

当然,如果您使用匿名类型(它们的属性是只读的),这些技术都不起作用。 不要对查询结果使用匿名类型。

Here's a clever way to get those mids - Skip, Reverse, Skip (what is this, 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;

Here's a better way for this problem statement.

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;

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.

小姐丶请自重 2024-07-20 07:50:35

您可能对我在 SmartEnumerable 类型感兴趣="http://pobox.com/~skeet/csharp/miscutil" rel="nofollow noreferrer">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" : "");
        }
    }
}

使用隐式类型变量和更多类型推断,可以很容易地整理语法。 我必须抽出时间来讨论这个问题,但基础知识已经存在了。

You might be interested in my SmartEnumerable type in MiscUtil.

From the usage page, there's an example:

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" : "");
        }
    }
}

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文