2015-12-29 58 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; } 
} 

現在,我想找回基於價值的範圍內的所有對象的關鍵。也就是說,我想選擇從鍵爲「BB」,以重點=「DD」(無字母排序)啓動列表中的所有對象,這樣我會有以下結果:

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'> ='不能應用於'string'和'string'_類型的操作數。 –

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

我假設你正在談論兩個speci之間的項目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 <>'中的開始和結束位置,然後在開始和結束點之間的列表中包含每個條目。你的解釋不等同於其他人的解釋。如果提問者會覈實他的意思,那將會很好。 –