Требование: хотелось бы, чтобы результат запроса мог быть проанализирован в модели или этот запрос [0] всегда равен = home.
Как уже говорили другие, вы могли бы использовать OrderBy
или ToDictionary
, чтобы поставить «домашние» предметы первыми. Тем не менее, это будет перечислять вашу последовательность более одного раза. Особенно OrderBy будет сравнивать элементы несколько раз, прежде чем обнаружит, что они равны в Order.
Но зачем сравнивать все эти элементы, если вы заинтересованы только в том, чтобы сначала поставить один элемент с надписью "Домой"?
Подумайте о создании функции расширения для вашего класса, которая будет делать то, что вы хотите, перечисляя ровно один раз. См. Демистифицированные методы расширения
static IEnumerable<string>PutWordFirst(this IEnumerable<string> source, string word)
{
List<string> nonWords = new List<string>();
foreach(var text in source)
{
if (text == word)
{
yield return word;
}
else
{
nonWords.Add(text);
}
}
foreach (var nonWord in nonWords) yield return nonWord;
}
Использование:
var query = query = context.MapTextToLanguages
.Where(language => ...)
.Select(language => ...)
.PutWordFirst("home");
Если вы хотите этот универсальный: функция, которая помещает элементы с определенным свойством в первую очередь:
static IEnumerable<TSource> WhereItemFirst<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
TKey keyValue,
IEqualityComparer<TKey> keyComparer)
{
// TODO: exception if source, keySelector, keyValue null
// if keyComparer null, use default comparer to compare TKeys
if (keyComparer == null) keyComparer = EqualityComparer<TKey>.Default;
List<TSource> nonKeyItems = new List<TSource>();
foreach(var item in source)
{
if (comparer.Equals(keySelector(item), keyValue))
{
// return the item with a value equal to keyValue
yield return item;
}
else
{
nonKeyItems.Add(item);
}
}
// return the nonKey items:
foreach (var nonKeyItem in nonKeyItems) yield return nonKeyItem;
}
И версия без компаратора:
static IEnumerable<TSource> WhereItemFirst<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, TKey keyValue)
{
// call the function above with null comparer, uses the default comparer
return source.WhereItemFirst(keySelector, keyValue, null);
}
Использование: сначала укажите людей, которые живут по моему адресу:
var myAddress = GetMyAddress();
var persons = GetPersons();
var myFamilyFirst = persons.WhereItemFirst(person => person.Address, myAddress);
Параметр keySelector
извлекает из каждого человека его Address
. Извлеченный Address
сравнивается с myAddress
. Если он совпадает, он возвращается первым.