C# 转换数组并从对象数组中获取信息

Posted

技术标签:

【中文标题】C# 转换数组并从对象数组中获取信息【英文标题】:C# Casting Array and getting information out of an array of objects 【发布时间】:2021-03-18 04:24:56 【问题描述】:

我正在尝试查看是否可以将菜单对象转换为食物。我将按照我的建议放入界面。

在我的自助餐代码中,在将所有东西添加到菜单对象后调用我的 Food 方法,我的目标是随机选择要吃的食物然后返回信息。

我希望我可以做一些事情,比如在我得到 mo =(Food) Menu[rand.Next(Menu.Count)]; 的地方可以让我轻松做到这一点。

我错了,我可能过于复杂了,因为我要返回 mo 但每次我尝试投射它时,它都不起作用。

也许我可以使用枚举器或其他东西,但这非常令人困惑。我想我对自己想要的东西有正确的想法,但是用语言表达很困难,所以谢谢大家对我的耐心。我希望这能更好地解释它:

我的自助餐课

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

我的饮料课

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;
        
    

我的美食课

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;
        
    

【问题讨论】:

我用如何获得随机食物的样本更新了我的答案。 【参考方案1】:

更新

如果你只是想随机抓取一个食物,你可以使用 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; 

然后将该接口添加到您的 FoodDrink 类中

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;

【讨论】:

你如何从中检索出一些东西,比如食物的名称,因为我对此有疑问 我展示了一个例子来写出列表中每个项目的名称。 是的,但我不想在每个循环中打印出来。我正在尝试获取一个随机物品并将其作为食品项目我将更新并显示我的代码 好的,需要一个清楚的例子来说明你想要做什么。 我举了一个例子,说明如何拉出一个随机菜单项,并根据它是什么类型的菜单项对值进行不同的处理。

以上是关于C# 转换数组并从对象数组中获取信息的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 C# 数组在转换为对象时会丢失类型符号信息?

试图从 C# 中的结构数组中删除一个条目。获取相互矛盾的信息?

如何将这个Promise对象转换成具有结果的数组

Firebase 按值对类数组进行排序

C# 对象文件与二进制串(byte数组)之间的转换

BitBlt 转换为字节数组并从 c++ 解析为 c#