是否有更好的/内联方式在C#/ LINQ中完成以下操作?

时间:2009-02-11 11:48:05

标签: c# linq lambda

我经常发现自己用需要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表达式分配给匿名类型属性”。

2 个答案:

答案 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;

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