我是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)时才会出现此错误。
如果有一个书名,一切都很好
我在这里缺少什么?
答案 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
}