C # LINQ рассчитывается Group By - PullRequest
1 голос
/ 24 июня 2010

Чтобы разобраться с духовыми делами, у меня есть список, содержащий 100 различных записей. У автомобиля есть год, марка и модель.

Мне нужно уметь:

  1. заказать это по Году, но мне нужно:

  2. есть все автомобили, которые являются Ford Исследователи появляются как «группа» на конец моего списка (также заказал по году)

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

Ваша помощь ценится и приветствуется!

Большое спасибо, Пол

Пример: * * один тысяча двадцать-одна



2001 Hummer H1
2002 Ford Focus
2008 BMW 325i
2008 Ford Escape
2009 BMW 328i
2009 Mitsubishi Galant
2003 Ford Explorer
Ford Explorer 2004
2008 Ford Explorer
2009 Ford Explorer


Ответы [ 3 ]

3 голосов
/ 24 июня 2010

Если вы действительно хотите, чтобы Ford Explorers были сгруппированы, вы можете сделать следующее:

var groupedByFordExplorer = from c in cars
                    let isFordExplorer = c.Make == "Ford" && c.Model == "Explorer"
                    orderby isFordExplorer, c.Year
                    select c;

То, что делает вышеупомянутый запрос, создает встроенное значение isFordExplorer и присваивает ему логическое значение, используя ключевое слово let, указывающее, является ли автомобиль Ford Explorer. Это значение можно затем отсортировать по году. Ниже приводится рабочая программа, которая должна продемонстрировать концепцию:

class Program
{
    static void Main(string[] args)
    {
        var cars = new List<Car>
        {
            new Car { Year = 2009, Make = "Ford", Model = "Explorer" },
            new Car { Year = 2001, Make = "Hummer", Model = "H1" },             
            new Car { Year = 2002, Make = "Ford", Model = "Focus" },
            new Car { Year = 2008, Make = "BMW", Model = "325i" },
            new Car { Year = 2008, Make = "Ford", Model = "Explorer" },             
            new Car { Year = 2008, Make = "Ford", Model = "Escape" },               
            new Car { Year = 2009, Make = "Mitsubishi", Model = "Galant" },
            new Car { Year = 2004, Make = "Ford", Model = "Explorer" },
            new Car { Year = 2009, Make = "BMW", Model = "329i" },
            new Car { Year = 2003, Make = "Ford", Model = "Explorer" }              
        };

        var groupedByFordExplorer = from c in cars
                                    let isFordExplorer = c.Make == "Ford" && c.Model == "Explorer"
                                    orderby isFordExplorer, c.Year
                                    select c;

        foreach (var car in groupedByFordExplorer)
        {
            Console.WriteLine("{0} {1} {2}", car.Year, car.Make, car.Model);
        }

        Console.ReadLine();
    }
}

class Car
{
    public int Year { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
}
2 голосов
/ 24 июня 2010

Это должно сделать это:

var query = list.OrderBy(car => car.Make == "Ford" && car.Model == "Explorer")
                .ThenBy(car => car.Year);

(Очевидно, отрегулируйте тест для Ford Explorer-ness.)

По сути, рассматривайте Ford Explorer-ness как логическое свойство, где false - этозаказал до истины.Конечно, вы также можете выразить это как выражение запроса:

var query = from car in list
            orderby car.Make == "Ford" && car.Model == "Explorer", car.Year
            select car;

(в этом случае я предпочитаю точечную запись).

0 голосов
/ 24 июня 2010
cars.OrderBy(c => 
        (c.Make == "Ford" && c.Model == "Explorer")
        ? c.Year + 10000
        : c.Year)
    .ToList()

думая о моем комментарии ниже, если бы это было LINQ to sql, я, вероятно, написал бы это с объединением:

cars.Where(c => c.Make != "Ford" || c.Model != "Explorer")
    .OrderBy(c => c.Year)
    .Union(cars.Where(c => c.Make == "Ford" && c.Model == "Explorer")
               .OrderBy(c => c.Year))
...