1

2 つの小さなクラスがPetあり、Bookそれぞれにいくつかのプロパティと、次のようなメソッドを持つ関数があります。

 public static List<T> GetSubSet<T>(List<T> incomingList)
        {
            var returnList = new List<T>();
            Random r = new Random();
            Console.WriteLine("Enter size of random subset: ");
            int randomInt = 0;
            int size = Convert.ToInt32(Console.ReadLine());
            while (size > incomingList.Count)
            {
                Console.WriteLine("Size too large, enter smaller subset: ");
                size = Convert.ToInt32(Console.ReadLine());
            }

            while (returnList.Count < size)
            {
                randomInt = r.Next(incomingList.Count);
                if (!returnList.Contains(incomingList[randomInt]))
                {
                    returnList.Add(incomingList[randomInt]);
                }
            }

            return returnList;
        }

オブジェクトの一般的なリストを取り、より小さなサブセットを返します。この関数は機能し、Pet または Book オブジェクトのいずれかを取ることができます。Pet と Book の両方のタイプを含むリストで同じ関数を使用したいと思います。これを行う方法を私が知っている最善の方法は、インターフェイスを使用することです (継承はここでは意味がありません)。

interface ISubset<T>
    {

        IEnumerable<T> GetSubset();
    }

Pet クラスにインターフェースを実装すると、次のようになります

  class Pet : ISubset<Pet>

私のメインクラスには、ペットと本のリストがあります。これら 2 つの両方にオブISubset​​ジェクトのリストを追加して、両方で GetSubset 関数を使用できるようにします。ただし、次のようなリストを宣言することはできません

List<ISubset<T>> list = new List<ISubset<T>>();

'the type or namespace T could not be foundインターフェイスがジェネリック型を受け入れる場合、 ISubset
オブジェクトのリストを宣言するにはどうすればよいですか?というエラーが表示されます。

わかりました、次のような2つのリストがあります

List<Pet> petList = new List<Pet>();
        petList.Add(new Pet() { Name = "Mr.", Species = "Dog" });
        petList.Add(new Pet() { Name = "Mrs.", Species = "Cat" });
        petList.Add(new Pet() { Name = "Mayor", Species = "Sloth" });
        petList.Add(new Pet() { Name = "Junior", Species = "Rabbit" });


List<Book> bookList = new List<Book>();
        bookList.Add(new Book() { Author = "Me", PageCount = 100, Title = "MyBook" });
        bookList.Add(new Book() { Author = "You", PageCount = 200, Title = "YourBook" });
        bookList.Add(new Book() { Author = "Pat", PageCount = 300, Title = "PatsBook" });

これらのリストをまとめて別のリストに追加したい場合、タイプは何にする必要がありますか?

4

2 に答える 2

4

を単に使用できますがList<object>、提案した方法で実行したい場合は、両方のクラスをカバーするシグネチャを持つインターフェイスを作成する必要があります

public interface IGen
{
    int A;
    int Method;
}

次に、クラスでこのインターフェースを継承/実装します

public class Pet : IGen
{
    public int A { get; set; }
    private int Method(){ ... }
}

public class Book : IGen
{
    public int A { get; set; }
    private int Method(){ ... }
}

GetSubSet次に、好きなものに渡すことができます

GetSubSet<IGen>(List<IGen> incomingList) { ... }

これが役立つことを願っています。

于 2013-07-05T15:40:53.567 に答える
1

List<object>正常に動作するはずです。

以下はLinqPadでテストされました

void Main()
{
    List<Pet> petList = new List<Pet>();
            petList.Add(new Pet() { Name = "Mr.", Species = "Dog" });
            petList.Add(new Pet() { Name = "Mrs.", Species = "Cat" });
            petList.Add(new Pet() { Name = "Mayor", Species = "Sloth" });
            petList.Add(new Pet() { Name = "Junior", Species = "Rabbit" });


    List<Book> bookList = new List<Book>();
            bookList.Add(new Book() { Author = "Me", PageCount = 100, Title = "MyBook" });
            bookList.Add(new Book() { Author = "You", PageCount = 200, Title = "YourBook" });
            bookList.Add(new Book() { Author = "Pat", PageCount = 300, Title = "PatsBook" });

    List<object> both = petList.OfType<object>().Union(bookList.OfType<object>()).ToList().Dump();
}

// Define other methods and classes here
public class Pet
{
  public string Name { get; set; }
  public string Species { get; set; }
}

public class Book
{
  public string Author { get; set; }
  public int PageCount { get; set; }
  public string Title { get; set; }
}
于 2013-07-05T15:46:40.423 に答える