Мне нужно отсортировать существующий список объектов на основе другого списка объектов (с совпадающими ключами), но оба списка могут содержать или не содержать одинаковые ключи и количество элементов. Пример:
struct Item
{
public string _id;
public Item(string id) { _id = id; }
}
List<Item> totalItems = new List<Item>()
{
new Item("foo"), new Item("bar"),
new Item("baz"), new Item("monkey"),
new Item("cat"), new Item("apple")
};
List<string> preferredSortOrder = new List<string>()
{
"monkey",
"cat",
"zebra",
"baz"
};
Таким образом, на выходе будет:
monkey
cat
baz
apple
bar
foo
Это потому, что порядок сортировки из PreferredSortOrder имеет приоритет, поэтому monkey, cat и baz идут первыми в списке, потому что они существуют в совокупности. Если чего-то в списке предпочтительныхSortOrder нет в totalItems, это следует игнорировать. Все оставшиеся элементы в totalItems следует затем упорядочить в алфавитном порядке (как вы можете видеть выше).
Я не программировал в linq годами, и все, что я пробовал до сих пор, не работает.
Изменить: на основе ответа Калимеро вот решение:
totalItems = totalItems
.OrderBy(item => item._id)
.OrderBy(item => {
var i = preferredSortOrder.IndexOf(item._id);
return i == -1 ? totalItems.Count : i;
}).ToList();