2012-02-21 49 views
-1

我試着寫在C#一個簡單的Lambda表達式:我的Lambda表達式有什麼錯誤?

int numElements = 3; 
string[]firstnames = {"Dave", "Jim", "Rob"}; 
string[]lastnames = {"Davidson", "Jameson", "Robertson"}; 

List<Person> people = new List<Person>(); 

for(int i = 0 ; i < numElements; i++) 
{ 
    people.Add(new Person { FirstName = firstnames[i], LastName = lastnames[i] });     
} 

bool test = people.Contains(p => p.FirstName == "Bob"); 

我的Lambda表達式以及它們是如何工作的理解還是有點陰涼,我惱火,爲什麼這是不行的......我「M試圖找出如果列表包含一個名稱...

+3

爲什麼不工作? – DaveShaw 2012-02-21 15:33:07

+3

你需要people.Any(....) - 這是需要lamba的LINQ操作符。在IEnumerable .Contains不會將lamba作爲參數。 – 2012-02-21 15:33:53

+3

'「Rob」!=「Bob」',所以'test'最終應該是'false'(一旦你使用'Any',正如詹姆斯所建議的那樣)。而'numElements'應該等於3,而不是10. – stakx 2012-02-21 15:34:31

回答

7

你是否在尋找:

bool test = people.Any(p => p.FirstName == "Bob"); 

或者,您在混合Rob和鮑勃?

6

這裏的問題不是lambdas,而是for循環的邊界。您定義的數組長度爲3,但numElements定義爲值爲10。這意味着您將在循環的第4次迭代中得到非法數組索引的異常。嘗試以下

int numElements = 3; 

或更簡單地除去numElements變量和代替迭代到firstnames陣列的長度

for (int i = 0; i < firstnames.length; i++) { 
    ... 
} 

EDIT

OP表示最初張貼的numElements是一個錯字。在代碼

  • 使用"Rob"而不是"Bob",如果你想找到一個匹配的元素
  • GenericList<T>需要Contains方法有一個兼容的委託簽名錯誤的其他可能的來源。 Func<T, bool>例如
+0

對不起:這是我的錯誤,當複製代碼,而不是問題。 – user559142 2012-02-21 15:38:15

+0

@ user559142那你打什麼問題? – JaredPar 2012-02-21 15:38:42

+0

其實他是在問lambda這個'people.Contains(p => p.FirstName ==「Bob」)'也不會編譯。 – 2012-02-21 15:41:58

2

您沒有設置numElements爲正確的值(將其設置爲10,但你的陣列只有3個值) - 而且你甚至都不需要,只需要使用一個集合初始化,而不是這些獨立的字符串數組:

GenericList<Person> people = new GenericList<Person>() 
{ 
    new Person { FirstName = "Dave", LastName = "Davidson" }, 
    new Person { FirstName = "Jim", LastName = "Jameson" } 
    new Person { FirstName = "Rob", LastName = "Robertson" } 
} 

現在假設你GenericList<T>類實現IEnumerable<T>可以使用Any()做你的測試:

bool test = people.Any(p => p.FirstName == "Bob"); 
0

你對這個lambdas的真正問題是什麼?

如果因爲你的測試爲假,則這是真的,你不必「鮑勃」在的firstName

bool test = people.Contains(p => p.FirstName == "Bob"); 

string[]firstnames = {"Dave", "Jim", "Rob"}; 
3
  1. 請確保您連接的System.Linq的namemespace,即

    using System.Linq; 
    
  2. 您正在使用Contains方法。此方法需要一個Person,並將使用相等比較來確定您的集合是否已包含它。在默認情況下,相等比較默認爲參考比較,因此它永遠不會包含它,但那是另一個主題。

  3. 要實現您的目標,請使用Any方法。這會告訴你集合中的任何元素是否符合條件。

    people.Any(p => p.FirstName == "BoB"); 
    

您可能想了解the extension methods第一和FirstOrDefault和地點,他們也能解決你的問題。

0

這裏有一些問題。

其中:GenericList不是一種類型。您可能正在尋找通用類型System.Collections.Generic.List<T>

二:Contains在您的示例中接受Person,而不是委託(lambdas是從C#3開始編寫委託的新方法)。得到你想要的這裏的一個方法是WhereCount結合,在bool test = people.Where(p => p.FirstName == "Bob").Count() > 0;

0
// We will use these things: 
Predicate<Person> yourPredicate = p => p.FirstName == "Bob"; 
Func<Person, bool> yourPredicateFunction = p => p.FirstName == "Bob"; 
Person specificPerson = people[0]; 

// Checking existence of someone: 
bool test = people.Contains(specificPerson); 
bool anyBobExistsHere = people.Exists(yourPredicate); 

// Accessing to a person/people: 
IEnumerable<Person> allBobs = people.Where(yourPredicateFunction); 
Person firstBob = people.Find(yourPredicate); 
Person lastBob = people.FindLast(yourPredicate); 

// Finding index of a person 
int indexOfFirstBob = people.FindIndex(yourPredicate); 
int indexOfLastBob = people.FindLastIndex(yourPredicate); 

你應該LINQ方法間或播放形式...

+0

謂語非常好的解釋! :) – Abbas 2012-02-21 15:56:52

相關問題