C# foreach 抽象的子级

标签 c# list foreach abstract children

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

的类

AbstractItem

这个类有3个 child 。 我的代码是:

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()
                        });
                }
            }
        }
    }

我想要做的是获取此列表中与 getByChosenField 匹配的所有值。
现在,在我的例子中,GetByChosenField 是一个 BookName,它返回列表中当前具有 BookName 名称的所有书籍。
执行搜索的代码确实有效。
问题是,如果我在 cooking 以及阅读和/或科学中有一本名为哈利波特的书,我收到错误:

Additional information: Unable to cast object of type 'CommonBookLib.Cooking' to type 'CommonBookLib.Reading'.

仅当我有至少 2 个其他类别的书名(阅读\ cooking \科学\期刊)时,才会出现此错误。
如果只有一本书名,一切都很好。
我在这里缺少什么?

最佳答案

你就快到了。

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

只需将该过滤器应用于您正在迭代的 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
 }

关于C# foreach 抽象的子级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36729759/

相关文章:

Python:将值列表拆分为两个值列表。列表的总和应尽可能相等

python - 列表中第一次出现(不等式匹配)的索引

php - 优化 foreach() 中的 SQL 查询

JavaScript:根据条件创建二维对象数组

c# - SqLite 中的存储图像占用的空间增加了 2 倍

c# - 获取在 RadGrid 中触发 ItemCommand 的控件的 ID

c# - 调整大小后删除拆分容器的边框

python - 查找数据最适合的 bin

c# - 如何在我的 C# 代码中调用库中的 C 方法?

java - 为什么这个 for-each 循环不起作用?