2

Person というオブジェクトのリストから拡張されたクラス (PersonCollection) で linq 操作を使用します。

public class PersonCollection: List<Person>
{
          //various functions
}

public class Person
{
           public string name{ get; set; }
           public string address { get; set; }
}

もともと、文字列のリストのリストを使用して、このクラスを構成するデータを格納していましたが、linq 操作は機能します。

    List<List<String>> oldList = GetList();

    oldList = (List<List<string>>)oldList .OrderBy(s =>s[index_of_name]).ToList();

これは機能しますが、概念実証のために本質的に簡単なコードを使用することから離れたいのは明らかです

これらの新しいクラスに適用される同じタイプの linq 操作は機能しません。

    people = (PersonCollection)orderedData.OrderBy(s => s.name]).ToList();

これは私が得るエラーです:

Unable to cast object of type 'System.Collections.Generic.List`1[Person]' to type 'PersonCollection'.

リストにキャストすると機能し、それが現在使用しているものです

    people = (List<Person>)people .OrderBy(s => s.name]).ToList();

人のリストから拡張された PersonCollection クラスを使用したいのですが、アプローチのどこが間違っていますか? コーディングであれ、データの分類方法の一般的な選択であれ

4

2 に答える 2

6

あなたPersonCollectionは ですがList<Person>、その逆ではありません。

List<Person>したがって、 aを a にキャストすることはできませんPersonCollection。タイプの新しいオブジェクトを作成する必要がありますPersonCollection

コンストラクターを使用してこれを行うことができます。

public class PersonCollection : List<Person>
{
  public PersonCollection( List<Person> list )
    : base( list )
  {
  }
}

PersonCollection次に、からを構築できますList<Person>

List<Person> list = people.OrderBy(s => s.name]).ToList();

PersonCollection pc = new PersonCollection( list );
于 2013-04-08T11:41:59.303 に答える
2

ニコラスの回答への補遺として、より短い構文を可能にするカスタム拡張メソッドを作成することをお勧めします。

public static class MyListExtensions {
    public static PersonCollection ToPersonCollection(this IEnumerable<Person> list) {
        return new PersonCollection(list.ToList());
    }
}

補足として、命名法を再考することをお勧めしPersonCollectionます。これは本当に陳腐に思えるかもしれませんが、コードをより読みやすくするために、命名について本当に正確であることがしばしば価値があります。CollectionList

于 2013-04-08T12:08:28.770 に答える