C# 转换数组并从对象数组中获取信息
C# Casting Array and getting information out of an array of objects
我正在尝试查看是否可以将菜单对象投射为食物。我将按照建议放入界面。
在我的自助餐代码中,在将所有内容添加到菜单对象后调用我的 Food 方法,我的目标是随机选择一种食物来吃,然后 return 信息。
我希望我可以做一些事情,比如我得到 mo =(Food) Menu[rand.Next(Menu.Count)];
的地方可以让我轻松做到这一点。
我错了,我可能把这个复杂化了,因为我打算 return mo
但每次我尝试施放它,它都没有用。
也许我可以使用枚举器或其他东西,但这非常令人困惑。我想我对自己想要的东西有正确的想法,但很难用语言表达,所以谢谢大家对我的耐心等待。我希望这能更好地解释它:
我的自助餐class
using System;
using System.Collections.Generic;
namespace IronNinja.Models
{
class Buffet
{
public List<Food> Foods = new List<Food>();
public List<Drink> Dranks = new List<Drink>();
public List<object> Menu = new List<object>();
//constructor
public Buffet()
{
Menu.Add(new Food("Chicken Pizza", 1000, false, true));
Menu.Add(new Food("Buffalo Chicken Pizza", 1000, true, false));
Menu.Add(new Food("Lasagna", 1200, false, true));
Menu.Add(new Food("Garden Salad WSalad dressing", 700, true, false));
Menu.Add(new Food("sour patch kids whole box", 700, false, true));
Menu.Add(new Drink("Rootbeer", 700, false));
Menu.Add(new Drink("Not Your Father's Rootbeer", 900, false));
}
// Add a constructor and Serve method to the Buffet class
public Food Serve()
{
Random rand = new Random();
Food mo = ((Food) Menu[rand.Next(Menu.Count)]);
Console.WriteLine(mo);
return new Food("sour patch kids whole box", 700, false, true);
}
}
}
我的饮料class
using IronNinja.Interfaces;
namespace IronNinja.Models
{
public class Drink : IConsumable
{
public string Name { get; set; }
public int Calories { get; set; }
public bool IsSpicy { get; set; }
public bool IsSweet { get; set; }
// Implement a GetInfo Method
public string GetInfo()
{
return $"{Name} (Drink). Calories: {Calories}. Spicy?: {IsSpicy},
Sweet?: {IsSweet.Equals(true)}";
}
// Add a constructor method
public Drink(string name, int calories, bool spicy)
{
Name = name;
Calories = calories;
IsSpicy = spicy;
IsSweet = true;
}
}
}
我的菜class
using IronNinja.Interfaces;
namespace IronNinja.Models
{
class Food : IConsumable
{
public string Name { get; set; }
public int Calories { get; set; }
public bool IsSpicy { get; set; }
public bool IsSweet { get; set; }
public string GetInfo()
{
return $"{Name} (Food). Calories: {Calories}. Spicy?: {IsSpicy},
Sweet?: {IsSweet}";
}
public Food(string name, int calories, bool spicy, bool sweet)
{
Name = name;
Calories = calories;
IsSpicy = spicy;
IsSweet = sweet;
}
}
}
更新
如果您只想抓取一个随机物品,即食物,您可以使用 Linq 表达式获取类型为 Food
.
的所有物品
Random rand = new Random();
var foodItems = Menu.OfType<Food>().ToList();
var randomFood = foodItems[rand.Next(foodItems.Count)];
我将创建一个名为 IMenuItem
的界面,它具有菜单上出现的每种类型的共享属性。
public interface IMenuItem
{
string Name { get; }
}
然后将该接口添加到您的 Food
和 Drink
类
public class Food : IMenuItem
{
public Food(string name, int calories, bool isSpicy, bool isSweet)
{
Name = name;
Calories = calories;
IsSpicy = isSpicy;
IsSweet = isSweet;
}
public string Name { get; }
public int Calories { get; }
public bool IsSpicy { get; }
public bool IsSweet { get; }
}
public class Drink: IMenuItem
{
public Drink(string name, int calories, bool isSpicy)
{
Name = name;
Calories = calories;
IsSpicy = isSpicy;
}
public string Name { get; }
public int Calories { get; }
public bool IsSpicy { get; }
}
现在您可以获得一个菜单项列表,您将能够访问这些共享属性而无需转换任何内容。
var menu = new List<IMenuItem>();
menu.Add(new Food("pizza", calories: 300, isSpicy: false, isSweet: true));
menu.Add(new Drink ("coke", calories: 300, isSpicy: false));
foreach(var menuItem in menu)
{
Console.WriteLine(item.Name);
}
输出
pizza
coke
此外,您可以使用模式匹配来根据实际类型做事。
var menu = new List<IMenuItem>();
menu.Add(new Food("pizza", calories: 300, isSpicy: false, isSweet: true));
menu.Add(new Drink("coke", calories: 300, isSpicy: false));
// get random menu item;
var rand = new Random();
var menuItem = menu[rand.Next(menu.Count)];
switch (menuItem)
{
case Food food: // random item is a food
Console.WriteLine($"Food Name:{food.Name}, Calories:{food.Calories}, IsSpicy:{food.IsSpicy}, IsSweet:{food.IsSweet}");
break;
case Drink drink: // random item is a drink
Console.WriteLine($"Drink Name:{drink.Name}, Calories:{drink.Calories}, IsSpicy:{drink.IsSpicy}");
break;
default: // random item is something else
Console.WriteLine($"Menu Item Name:{menuItem.Name}");
break;
}
我正在尝试查看是否可以将菜单对象投射为食物。我将按照建议放入界面。
在我的自助餐代码中,在将所有内容添加到菜单对象后调用我的 Food 方法,我的目标是随机选择一种食物来吃,然后 return 信息。
我希望我可以做一些事情,比如我得到 mo =(Food) Menu[rand.Next(Menu.Count)];
的地方可以让我轻松做到这一点。
我错了,我可能把这个复杂化了,因为我打算 return mo
但每次我尝试施放它,它都没有用。
也许我可以使用枚举器或其他东西,但这非常令人困惑。我想我对自己想要的东西有正确的想法,但很难用语言表达,所以谢谢大家对我的耐心等待。我希望这能更好地解释它:
我的自助餐class
using System;
using System.Collections.Generic;
namespace IronNinja.Models
{
class Buffet
{
public List<Food> Foods = new List<Food>();
public List<Drink> Dranks = new List<Drink>();
public List<object> Menu = new List<object>();
//constructor
public Buffet()
{
Menu.Add(new Food("Chicken Pizza", 1000, false, true));
Menu.Add(new Food("Buffalo Chicken Pizza", 1000, true, false));
Menu.Add(new Food("Lasagna", 1200, false, true));
Menu.Add(new Food("Garden Salad WSalad dressing", 700, true, false));
Menu.Add(new Food("sour patch kids whole box", 700, false, true));
Menu.Add(new Drink("Rootbeer", 700, false));
Menu.Add(new Drink("Not Your Father's Rootbeer", 900, false));
}
// Add a constructor and Serve method to the Buffet class
public Food Serve()
{
Random rand = new Random();
Food mo = ((Food) Menu[rand.Next(Menu.Count)]);
Console.WriteLine(mo);
return new Food("sour patch kids whole box", 700, false, true);
}
}
}
我的饮料class
using IronNinja.Interfaces;
namespace IronNinja.Models
{
public class Drink : IConsumable
{
public string Name { get; set; }
public int Calories { get; set; }
public bool IsSpicy { get; set; }
public bool IsSweet { get; set; }
// Implement a GetInfo Method
public string GetInfo()
{
return $"{Name} (Drink). Calories: {Calories}. Spicy?: {IsSpicy},
Sweet?: {IsSweet.Equals(true)}";
}
// Add a constructor method
public Drink(string name, int calories, bool spicy)
{
Name = name;
Calories = calories;
IsSpicy = spicy;
IsSweet = true;
}
}
}
我的菜class
using IronNinja.Interfaces;
namespace IronNinja.Models
{
class Food : IConsumable
{
public string Name { get; set; }
public int Calories { get; set; }
public bool IsSpicy { get; set; }
public bool IsSweet { get; set; }
public string GetInfo()
{
return $"{Name} (Food). Calories: {Calories}. Spicy?: {IsSpicy},
Sweet?: {IsSweet}";
}
public Food(string name, int calories, bool spicy, bool sweet)
{
Name = name;
Calories = calories;
IsSpicy = spicy;
IsSweet = sweet;
}
}
}
更新
如果您只想抓取一个随机物品,即食物,您可以使用 Linq 表达式获取类型为 Food
.
Random rand = new Random();
var foodItems = Menu.OfType<Food>().ToList();
var randomFood = foodItems[rand.Next(foodItems.Count)];
我将创建一个名为 IMenuItem
的界面,它具有菜单上出现的每种类型的共享属性。
public interface IMenuItem
{
string Name { get; }
}
然后将该接口添加到您的 Food
和 Drink
类
public class Food : IMenuItem
{
public Food(string name, int calories, bool isSpicy, bool isSweet)
{
Name = name;
Calories = calories;
IsSpicy = isSpicy;
IsSweet = isSweet;
}
public string Name { get; }
public int Calories { get; }
public bool IsSpicy { get; }
public bool IsSweet { get; }
}
public class Drink: IMenuItem
{
public Drink(string name, int calories, bool isSpicy)
{
Name = name;
Calories = calories;
IsSpicy = isSpicy;
}
public string Name { get; }
public int Calories { get; }
public bool IsSpicy { get; }
}
现在您可以获得一个菜单项列表,您将能够访问这些共享属性而无需转换任何内容。
var menu = new List<IMenuItem>();
menu.Add(new Food("pizza", calories: 300, isSpicy: false, isSweet: true));
menu.Add(new Drink ("coke", calories: 300, isSpicy: false));
foreach(var menuItem in menu)
{
Console.WriteLine(item.Name);
}
输出
pizza
coke
此外,您可以使用模式匹配来根据实际类型做事。
var menu = new List<IMenuItem>();
menu.Add(new Food("pizza", calories: 300, isSpicy: false, isSweet: true));
menu.Add(new Drink("coke", calories: 300, isSpicy: false));
// get random menu item;
var rand = new Random();
var menuItem = menu[rand.Next(menu.Count)];
switch (menuItem)
{
case Food food: // random item is a food
Console.WriteLine($"Food Name:{food.Name}, Calories:{food.Calories}, IsSpicy:{food.IsSpicy}, IsSweet:{food.IsSweet}");
break;
case Drink drink: // random item is a drink
Console.WriteLine($"Drink Name:{drink.Name}, Calories:{drink.Calories}, IsSpicy:{drink.IsSpicy}");
break;
default: // random item is something else
Console.WriteLine($"Menu Item Name:{menuItem.Name}");
break;
}