2015-12-29 2 views
1

Я следующий список:Список выбора диапазона объектов на основе стоимости недвижимости

List<MyType> myList = new List<MyType> 
{ 
    new MyType {Key = "aa", Value = "test1"}, 
    new MyType {Key = "bb", Value = "test2"}, 
    new MyType {Key = "zz", Value = "testzz"}, 
    new MyType {Key = "cc", Value = "test3"}, 
    new MyType {Key = "yy", Value = "testyy"}, 
    new MyType {Key = "dd", Value = "test4"}, 
    new MyType {Key = "ee", Value = "test5"} 
}; 

где

public class MyType 
{ 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 

Теперь я хотел бы получить все объекты в пределах диапазона на основе значения Ключа. То есть, я хотел бы, чтобы выбрать все объекты из списка, начиная с Key = «бб» в Key = «дд» (не алфавитный заказа), так что я должен был бы следующий результат:

new MyType {Key = "bb", Value = "test2"}, 
new MyType {Key = "zz", Value = "testzz"}, 
new MyType {Key = "cc", Value = "test3"}, 
new MyType {Key = "yy", Value = "testyy"}, 
new MyType {Key = "dd", Value = "test4"} 

Как могу ли я достичь этого с помощью выражения linq/lambda?

[Обновить: 12/30/2015]: Ключ НЕ заказывается в алфавитном порядке, и могут быть сотни ключей. Таким образом, решения, включающие list.Contains (..) и предполагающие алфавитный порядок, не будут работать. Я также обновил пример, чтобы включить объекты с ключами «yy» и «zz», чтобы отразить их.

+1

Как разнообразны могут ваши критерии быть на самом деле? Всегда ли они в диапазоне или могут быть полностью непересекающимися? В зависимости от этого могут быть разные ответы. – ChrisF

ответ

0

Вы можете просто использовать Where:

string start = "bb"; 
string end = "dd"; 

var rows = myList.Where(x => x.CompareTo(start) >= 0 && x.CompareTo(end) <= 0); 
+4

Только если клавиши смежны и имеют порядок сортировки. – ChrisF

+0

Действительно. Для сложных сценариев вы должны создать собственный метод сравнения. –

+0

_Operator '> =' не может применяться к операндам типа «строка» и «строка», которые вы знаете. –

1

Если у вас есть непересекающиеся набор ключей, то вы можете использовать Contains оператор:

var keys = new [] { "bb", "cc", "dd" }; 

var result = myList.Where(x => keys.Contains(x.Key)); 
0

Попробуйте это: -

var kys = new[] { "bb", "cc", "dd" }; 
var Result = myList.Where(x => kys.Contains(x.Key)); 
1

Я предполагаю, что вы говорите об элементах, которые находятся между двумя спецификациями fic (в месте, не основанном на алфавитном порядке).

Вот как вы можете это сделать:

bool found_last = false; 

var first = "bb"; 
var last = "dd"; 

var result = myList.SkipWhile(x => x.Key != first).TakeWhile(x => 
{ 
    if (x.Key == last) 
    { 
     found_last = true; 
     return true; 
    } 

    return !found_last; 

}).ToList(); 
+1

Каждый другой ответ пытается найти записи из 'List <>', независимо от того, где они находятся в списке, так что ключ каждой записи находится между двумя «крайними» значениями ('' bb "' и '" dd "') в алфавитном порядке. Ваш ответ интерпретирует проблему по-разному. Вы используете '' bb "' и '' dd "' для определения начальной и конечной позиции в «List <>», затем включаете каждую запись в список, расположенный между начальной и конечной точкой (включая включительно). Ваша интерпретация не эквивалентна интерпретации других. Было бы неплохо, если бы он спросил, что он имел в виду. –

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