0

顧客モデルにデータテーブルの行を入力しようとしていますが、構文を正しく取得できませんでした。元のコードは、このチュートリアルYour First ASP.NET Web API(C#)から取得したものです。

コントローラーにDataTableを追加しましたが、テーブルから顧客モデルに行を取得する方法を理解できませんでした。foreachでそれができると思いましたが、私が言ったように、構文を正しく取得できません。これは私が持っているものです

    Customer[] customers = new Customer[]
    {
        //new Customer {Id = "123", FirstName = "Buk", LastName = "Hix" }
        // Replace hard coded customer information with foreach loop.

        //commented out because it causes compile warnings
        //foreach (DataRow row in GetAllData().Rows)
        //{
        //    yield return new Customer
        //    {
        //        CustomerId = Convert.ToString(row["CustomerId"]),
        //        FirstName = Convert.ToString(row["FirstName"]),
        //        LastName = Convert.ToString(row["LastName"])
        //    };
        //}
    };

    public IEnumerable<Customer> GetAllCustomers()
    {            
        return customers;
    }  

私がやろうとしていることを達成するための最良の方法は何ですか?

4

2 に答える 2

2

LINQ を使用できます。

Customer[] customers = GetAllData()
    .Rows
    .Cast<DataRow>()
    .Select(row => new Customer
    {
        CustomerId = Convert.ToString(row["CustomerId"]),
        FirstName = Convert.ToString(row["FirstName"]),
        LastName = Convert.ToString(row["LastName"])
    })
    .ToArray();

拡張メソッドをスコープに入れるために、ディレクティブに追加System.Linqしたことを確認してください。using

于 2012-05-31T06:10:19.493 に答える
1

あなたは近くにいます。イテレータ ( を使用する IEnumerable/IEnumerator を返す関数) を作成する場合は、必要に応じyieldて本体にコードをyield値に配置するだけです。それらを別のコレクションに入れる必要はありません。コンパイラは、コードの反復子を生成します。

public IEnumerable<Customer> GetAllCustomers()
{
    foreach (DataRow row in GetAllData().Rows)
    {
        yield return new Customer
        {
            CustomerId = row.Field<string>("CustomerId"),
            FirstName = row.Field<string>("FirstName"),
            LastName = row.Field<string>("LastName"),
        };
    }
}

ただし、オープンにしている場合は、ここで LINQ を使用することをお勧めします。

public IEnumerable<Customer> GetAllCustomers()
{
    return
        from row in GetAllData().Rows
        select new Customer
        {
            CustomerId = row.Field<string>("CustomerId"),
            FirstName = row.Field<string>("FirstName"),
            LastName = row.Field<string>("LastName"),
        };
}
于 2012-05-31T04:01:14.360 に答える