我是 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/