2013-05-21 119 views
1

獲取一個IList 我有一個 IList<Person>對象。 Person類有田, FirstNameLastName自IList <object_type>

我有一個函數,它接受IList<string>,我想在IList<Person>對象的相同順序FirstNames名單通過。有沒有辦法做到這一點,而不用建立人名單中所有名字的列表?

如果我可以改變功能採取不同的參數(除了ILIst<Person>,功能是特定於字符串,而不是人),也許IEnumerable<string>?但我寧願使用IList<string>

+0

@TimSchmelter:他有一個IList的'' ......他想改變成'的IList ',其內容是'Person.FirstName'。 –

+0

你真的想'IList ',還是'IReadOnlyList '夠嗎? 'IList '還包括諸如「Add」之類的方法,它不適合你。甲'IReadOnlyList 選擇(此IReadOnlyList 列表中,函數功能 FUNC)'擴展方法將是很容易創建。 – hvd

回答

4

Enumerable.Select會返回一個字符串IEnumerable的(名字)你。

http://msdn.microsoft.com/en-us/library/bb548891.aspx

myFunction(people.Select(o => o.FirstName))

你也可以添加在ToList(),如果你真的想在List

myFunction(people.Select(o => o.FirstName).ToList())

Enumerable.Select傳遞的是,在C#中介紹的方法3作爲LINQ的一部分。瞭解更多關於LINQ here的信息。請參閱推遲執行here的簡要說明。

+0

我做了一些關於LINQ的閱讀,我對.NET編譯器會優化一些查詢感到印象深刻。其中一個特別之處在於,如果您在IEnumerable上使用Count方法,則LINQ不必迭代,但如果它存在,則可以在集合上使用Count方法。 – bpeikes

0

你可以有你的方法接受一個IEnumerable<T>(其中T是值類型)。例如,public void Foo(IEnumerable<string> firstNames) { ... }。如果您只想遍歷列表並且不按索引訪問它,那麼這將是有效的,因爲IList<T>會允許您執行此操作。 myPersonsList.Select(person => person.FirstName);

假設你確定這一點,你可以簡單地通過執行LINQ方法建立一個枚舉對象。由於Enumerable的工作原理(延遲執行),它比創建新列表更有效,然後迭代它。

0

我覺得這兩個上面貼的答案將解決你的問題,但最好使用擴展方法,而不是你自己的方法。

粘貼示例供您參考。

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Person> persons = new List<Person>(); 
     persons.Select(c => c.FirstName).DoSomething(); 
    } 
} 

public static class StringListExtension 
{ 
    public static int DoSomething(this IEnumerable<string> strList) 
    { 
     return strList.Count(); 
    } 
} 

class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 
相關問題