Чтобы довести это до сведения медных гвоздей, у меня есть список, содержащий 100 различных записей. У автомобиля есть год, марка и модель.
Мне нужно уметь:
Закажите это в соответствии с Годом, но мне нужно:
есть все автомобили Ford Исследователи появляются в виде "группы" на конец моего списка (также заказанный по Году)
Я не уверен, что мне придется создать 2 отдельных списка, а затем объединить их ... похоже, должен быть лучший способ сделать это, чем создание нескольких объектов.
Ваша помощь приветствуется и приветствуется!
Большое спасибо, Пол
Примере:
2001 Hummer H1
2002 Ford Focus
2008 BMW 325i
2008 Ford Escape
2009 BMW 328i
2009 Mitsubishi Galant
Ford Explorer 2003 года
Ford Explorer 2004 года
Ford Explorer 2008 года
Ford Explorer 2009 года
3 ответа
Если вы действительно хотите сгруппировать только 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; }
}
let
не следует недооценивать. Мне лично нравится точечная нотация для большинства простых вещей, однако синтаксис запросов LINQ предлагает много возможностей и контроля с помощью let
, которых просто не может достичь точечная нотация. Думаю, этот простой пример - хорошая демонстрация этого полезного инструмента. Я думаю, также следует отметить, что это инструмент для решения проблем ... насколько красив код, не так много для меня значит, как то, насколько он способен является. Однако я по-прежнему предпочитаю удобочитаемость синтаксиса запроса синтаксису с точками.
let
полезно, когда вы используете одно и то же выражение более одного раза, или когда это сложно, а присвоение концепции имени помогает для ясности - но в этом случае я бы не стал его использовать.
let
, как я, очень ясно показывает, что вы выполняете сортировку по логическому значению. Я согласен с тем, что ключевое слово select довольно "бесполезно", но оно никоим образом не снижает ясности утверждения. Это может быть не «красиво», но читабельно, понятно и ясно в смысле цели.
Это должно сделать это:
var query = list.OrderBy(car => car.Make == "Ford" && car.Model == "Explorer")
.ThenBy(car => car.Year);
(Очевидно, отрегулируйте тест на соответствие Ford Explorer.)
В основном думайте о Ford Explorer-ness как о логическом свойстве, где ложь предшествует истине. Конечно, вы также можете выразить это как выражение запроса:
var query = from car in list
orderby car.Make == "Ford" && car.Model == "Explorer", car.Year
select car;
(В этом случае я предпочитаю точечную нотацию.)
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))
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
make, model, year
или вам действительно нужны группыmake, model
, упорядоченные поyear
?