2013-08-22 3 views
2

У меня есть список, который я хочу просмотреть и отсортировать по фиксированному имени. Если говорят, что в моем списке есть такие товары, как:сортировать элемент в списке по индивидуальному заказу

Тогда я хочу иметь оранжевый всегда наверху. Так что мой заказ будет Оранжевый => Банан => Манго => Олив.

Я просто не знаю, как я сортирую его по индивидуальному заказу.

Я попытался с помощью

list = list.OrderBy(x => x.Name).toList(); 

, но это дает оливковое масло на вершине. Каким может быть способ сортировки? Какие-либо предложения?

Обновление Если Orange отсутствует в списке, тогда мне не нужна сортировка.

+3

[Удалить] (http://msdn.microsoft.com/en-us/library/cd666k3e.aspx) «Оранжевый» из списка, если он присутствовал, сортирует список, [insert] (http: // msdn.microsoft.com/en-us/library/sey5k5z4.aspx) 'Оранжевый' как первый элемент. – millimoose

+0

Вы можете сделать Enum (размещение элементов в том порядке, в котором вы хотите, чтобы ваши объекты были отсортированы), а затем использовать тот же запрос LINQ, который вы использовали здесь (путем литья каждого элемента enum в int). Таким образом, ваш список будет List Prash

+0

@millimoose вы можете показать, как? – Happy

ответ

5
list = list.OrderBy(x => x.Name != "Orange").ToList(); 

Это будет двигаться «оранжевые» элементы в верхней части списка, потому что ключ селектор будет иметь значение false для этих элементов. А для других предметов это будет true.


То же для строк выборки:

List.OrderBy(x => x != "Orange") 

Дает

Orange // false 
Banana // true 
Apple // true 
Olive // true 
+0

Итак, «Банан» стоит перед «Яблоком»? Хммм. –

+0

@MatthewWatson, зачем это нужно? Это первое место в сборнике источников. Требование состоит только в том, чтобы надеть «оранжевые» предметы. –

+0

Он говорит, что хочет «сортировать его по фиксированному имени», что я, возможно, неправильно понял, чтобы он хотел его сортировать. Думаю, он просто имел в виду, что если в списке содержится «Оранжевый», он должен быть размещен спереди. –

1

Предполагая, что список ввода список string с, следующий будет поместить все «оранжевые» с на начало:

var fruits = new List<string> { 
    "Banana", 
    "Orange", 
    "Apple", 
    "Olive" 
}; 

const string Orange = "Orange"; 

for (int i = 0; i < fruits.RemoveAll(fr => fr == Orange); i++) { 
    fruits.Insert(0, Orange); 
} 

Console.WriteLine(string.Join(", ", fruits)); 

Для этого необходимо, чтобы Orange s были взаимозаменяемыми значениями/валовыми объектами.

+0

Поскольку мы теперь знаем, что сортировка не требуется, ваш ответ упрощается до 'if (list.Remove (« Orange »)) list.Insert (0,« Orange »);' (и тогда это лучший ответ ИМХО) –

0

Попробуйте использовать enum для фруктов и присвойте значения enums в зависимости от вашей настройки.

public enum Fruits 
{ 
    Orange = 1, 
    Banana = 2, 
    Mango = 3, 
    Olive = 4 
} 
static void Main(string[] args) 
{ 
    Fruits[] List = new Fruits[4]; 
    List[0] = Fruits.Banana; 
    List[1] = Fruits.Orange; 
    List[2] = Fruits.Mango; 
    List[3] = Fruits.Olive; 

    var sortedList = List.OrderBy(x => x); 

    foreach (var item in sortedList) 
    { 
     Console.WriteLine(item.ToString()); 
    } 
} 
0

Создайте свой список, проверьте, если он содержит «Orange», если оно удаляет элемент (не основанный на Index, так что это может быть в любом месте в списке), а затем вставить «Orange» снова на старте список.

List<string> myList = new List<string>(); 
myList.Add("Banana"); 
myList.Add("Orange"); 
myList.Add("Apple"); 
myList.Add("Olive"); 

if (myList.Contains("Orange")) 
{ 
    myList.Remove("Orange"); 
    myList.Insert(0,"Orange"); 
} 

Если предположить, что «Апельсин» является объектом со свойствами, которые вы хотели бы изменить выше, чтобы создать новый сингл входом в инстанс этого типа объекта, со всеми теми же свойствами, что и исходный (эффективно object = object).

Смежные вопросы