1

私はIList<Person>オブジェクトを持っています。FirstNamePerson クラスには、、、LastNameなどのフィールドがあります。

IList<string>オブジェクトと同じ順序で FirstNames のリストを渡したい関数がありIList<Person>ます。Person リストのすべての名前で List を構築せずにこれを行う方法はありますか?

関数を変更して別のパラメーターを取ることができたらどうなるでしょうか(ILIst<Person>関数は、Persons ではなく文字列に固有のものです) 。IEnumerable<string>むしろ使ってみたいIList<string>けど。

4

3 に答える 3

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.SelectLINQ の一部として C# 3 で導入されたメソッドです。LINQ の詳細については、こちらをご覧ください。ここで遅延実行の簡単な説明を参照してください。

于 2013-05-21T20:27:18.107 に答える
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; }
}
于 2013-05-21T20:48:11.770 に答える
0

IEnumerable<T>メソッドに an (T は値の型)を受け入れるようにすることができます。たとえば、public void Foo(IEnumerable<string> firstNames) { ... }. これは、リストを反復処理するだけで、インデックスでアクセスしない場合に有効ですIList<T>

これで問題ないと仮定すると、LINQ メソッドを実行して Enumerator オブジェクトを簡単に作成できますmyPersonsList.Select(person => person.FirstName);。Enumerable の動作 (遅延実行) の性質上、新しいリストを作成してから反復するよりも効率的です。

于 2013-05-21T20:31:12.870 に答える