Есть ли более приятный / встроенный способ выполнить следующее в C # / LINQ? - PullRequest
1 голос
/ 11 февраля 2009

Часто я обнаруживаю, что заполняю повторители 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";
  }
}

Есть ли лучший способ добиться этого (например, с помощью лямбда-функций)? Если я пытаюсь получить CS0828, «Невозможно назначить лямбда-выражение для свойства анонимного типа».

Ответы [ 2 ]

4 голосов
/ 11 февраля 2009

Вас может заинтересовать мой 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" : "");
        }
    }
}

С неявно типизированными переменными и немного большим количеством выводов типов синтаксис может быть легко приведен в порядок. Я должен вернуться к этому некоторое время, но основы уже есть.

0 голосов
/ 11 февраля 2009

Вот умный способ получить эти средние значения - Пропустить, Реверс, Пропустить (что это, 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;

Конечно, ни один из этих методов не будет работать, если вы используете анонимные типы (их свойства доступны только для чтения). Не используйте анонимные типы для результатов запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...