C#foreach对一个摘要的孩子

时间:2016-04-19 21:23:55

标签: c# list foreach abstract children

我是C#的新手,我的问题是:
我有一个名为

的班级
  

AbstractItem

这个班有三个孩子。 我的代码是:

private void AddChecker(List<AbstractItem> getByChosenField)
    {
        if (getByChosenField == null)
        {
            MessageBox.Show("Entry list is currently empty.");
        }
        else {
            LibraryList.Items.Clear(); // simply if there are no results then list remains empty.
            if (getByChosenField.OfType<Reading>().Count() > 0)
            {
                foreach (Reading item in getByChosenField)
                {
                    LibraryList.Items.Add(
                        new MyItems
                        {
                            ItemName = item.ItemName,
                            CopyNumber = int.Parse(item.CopyNumber.ToString()),
                            Guid = int.Parse(item.Guid.ToString()),
                            TimePrinted = item.Time,
                            BestSeller = item.BestSeller,
                            Category = item.BookCategory.ToString(),
                            SubCategory = item.ReadingBookSubCategory.ToString()
                        });
                }
            }
            if (getByChosenField.OfType<Cooking>().Count() > 0)
            {
                foreach (Cooking item in getByChosenField)
                {
                    LibraryList.Items.Add(
                        new MyItems
                        {
                            ItemName = item.ItemName,
                            CopyNumber = int.Parse(item.CopyNumber.ToString()),
                            Guid = int.Parse(item.Guid.ToString()),
                            TimePrinted = item.Time,
                            BestSeller = item.BestSeller,
                            Category = item.BookCategory.ToString(),
                            SubCategory = item.CookingBookSubCategory.ToString()
                        });
                }
            }
            if (getByChosenField.OfType<Science>().Count() > 0)
            {
                foreach (Science item in getByChosenField)
                {
                    LibraryList.Items.Add(
                        new MyItems
                        {
                            ItemName = item.ItemName,
                            CopyNumber = int.Parse(item.CopyNumber.ToString()),
                            Guid = int.Parse(item.Guid.ToString()),
                            TimePrinted = item.Time,
                            BestSeller = item.BestSeller,
                            Category = item.BookCategory.ToString(),
                            SubCategory = item.ScienceBookSubCategory.ToString()
                        });
                }
            }
            if (getByChosenField.OfType<Journal>().Count() > 0)
            {
                foreach (Journal item in getByChosenField)
                {
                    LibraryList.Items.Add(
                        new MyItems
                        {
                            ItemName = item.ItemName,
                            CopyNumber = int.Parse(item.CopyNumber.ToString()),
                            Guid = int.Parse(item.Guid.ToString()),
                            TimePrinted = item.Time,
                            Category = "Journal",
                            SubCategory = item.JournalCategory.ToString()
                        });
                }
            }
        }
    }

我要做的是获取此List中与getByChosenField匹配的所有值。
现在,在我的案例中,GetByChosenField是 BookName ,它返回列表中当前具有 BookName 名称的所有图书。
进行搜索的代码确实有用 问题是,如果我在烹饪中有一个书名哈利波特,还有阅读和\或科学,我收到一个错误:

  

其他信息:无法将“CommonBookLib.Cooking”类型的对象强制转换为“CommonBookLib.Reading”。

只有当我至少有2个其他类别的书名(Reading \ Cooking \ Science \ Journal)时才会出现此错误。
如果有一个书名,一切都很好 我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

你几乎就在那里。

您知道如何将列表过滤为特定子类型的项目。

只需将该过滤器应用于您正在迭代的IEnumerable

        if (getByChosenField.OfType<Reading>().Any()) // Faster than Count() > 0
        {
            foreach (Reading item in getByChosenField.OfType<Reading>())
            {
                LibraryList.Items.Add(
                    new MyItems
                    {
                        ItemName = item.ItemName,
                        CopyNumber = int.Parse(item.CopyNumber.ToString()),
                        Guid = int.Parse(item.Guid.ToString()),
                        TimePrinted = item.Time,
                        BestSeller = item.BestSeller,
                        Category = item.BookCategory.ToString(),
                        SubCategory = item.ReadingBookSubCategory.ToString()
                    });
            }
        }

当然,一旦我们这样做,if条款就变得多余了。如果没有匹配类型的项目,它将简单地跳过循环。

 foreach (Reading item in getByChosenField.OfType<Reading>())
 {
      // Add the Reading item
 }
 foreach(Cooking item in getByChosenField.OfType<Cooking>()) 
 {
    //Add the Cooking item
 }
 foreach(Science item in getByChosenField.OfType<Science>())
 {
    // Add the science item
 }