C# 在类属性内组织实例的元素

C# 在类属性内组织实例的元素,c#,.net,C#,.net,我有一类图书馆的客户,每个客户都有四种最喜欢的类型:冒险、浪漫、警察和科幻 例如,现在我有一个定义为结构的类属性 public struct PrefGenres { public bool adventure, romance, police, scifi; } 在创建客户机类的新元素之前,我创建了一个新的预类型结构,并将所有元素定义为false,在读取用户选择的复选框后,我将他选择的类型更改为true 然后我将其作为参数发送到客户机实例。 我想知道的是,是否有更好的方法可以做到这一

我有一类图书馆的客户,每个客户都有四种最喜欢的类型:冒险、浪漫、警察和科幻

例如,现在我有一个定义为结构的类属性

public struct PrefGenres
{
    public bool adventure, romance, police, scifi;
}
在创建客户机类的新元素之前,我创建了一个新的预类型结构,并将所有元素定义为false,在读取用户选择的复选框后,我将他选择的类型更改为true

然后我将其作为参数发送到客户机实例。 我想知道的是,是否有更好的方法可以做到这一点,如果有,我该如何编写代码

我一直在考虑使用枚举,但检查值却变得非常痛苦。我看到它的唯一方法是将枚举作为字符串,然后查看该字符串中是否存在一个接一个的类型

我不要向量!这才是简单的方法

提前谢谢

我不使用C#或经典OOP语言,但我认为您对enum能给您带来什么有一个模糊的概念

您正在创建布尔值的枚举,我认为它应该更像这样:

//taken from https://msdn.microsoft.com/en-us/library/sbbt4032.aspx 
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
//in your case:
enum PrefGenres = {adventure, romance, police, scifi}
在模型中,Person看起来像:

public class Person()
{
    public string Name {get;set}
    public Genres PrefGenres {get;set;}
}
在您的模型(客户机)中,应该看到

var person = new Person();
person.name = "André";
Person.prefGenres = new Array( PrefGenres.adventure, PrefGenres.romance );

我不知道数组或集合的语法或C#在这些情况下使用的任何语法。

我将使用字符串列表,这样当您需要支持更多首选项时,就不必在多个位置更改代码

不知道你在这里是什么意思:

我不要向量!这才是简单的方法


“解决方案应该尽可能简单,但不能简单。”向爱因斯坦道歉,或者可能创建一个具有foud属性的类:

public class Genres()
{
    public bool Adventure {get;set;}
    public bool Romance {get;set;}
    public bool Police {get;set;}
    public bool Scifi {get;set;}
}
而在你的身体内部,类似于:

public class Person()
{
    public string Name {get;set}
    public Genres PrefGenres {get;set;}
}
然后只想:

Person person = new Person();
person.PrefGenres = new Genres() { 
Adventure = False,
Romance = True,
Police = False,
Scifi = False
 };

:)

我认为一个由标志组成的
enum
,再加上一些小的助手扩展方法,将是一个干净、简单的解决方案

例如:

namespace TryOuts
{
    using System;
    using System.Collections.Generic;

    [Flags]
    public enum PreferedGenres
    {
        None = 0,
        Adventure = 1,
        Romance = 2,
        Police = 4,
        SciFi = 8
    }

    public static class PreferedGenresExtensions
    {
        public static PreferedGenres AddPreference(this PreferedGenres current, PreferedGenres toAdd)
        {
            return current | toAdd;
        }
        public static PreferedGenres RemovePreference(this PreferedGenres current, PreferedGenres toRemove)
        {
            return current & ~(toRemove);
        }
        public static IEnumerable<PreferedGenres> GetSelectedPreferences(this PreferedGenres genres)
        {
            foreach (PreferedGenres g in Enum.GetValues(typeof(PreferedGenres)))
                if (genres.HasFlag(g) && g != PreferedGenres.None)
                    yield return g;
        }
        public static IEnumerable<PreferedGenres> GetSelectablePrefences(this PreferedGenres genres)
        {
            foreach (PreferedGenres g in Enum.GetValues(typeof(PreferedGenres)))
                if (!genres.HasFlag(g))
                    yield return g;
        }
    }

    class Program
    {
        public static void Main(params string[] args)
        {
            var myPreferences = PreferedGenres
                .None
                .AddPreference(PreferedGenres.SciFi)
                .AddPreference(PreferedGenres.Adventure);
            Console.WriteLine("My preferences:");
            foreach (var p in myPreferences.GetSelectedPreferences())
                Console.WriteLine(p);
            Console.WriteLine("Available for selection:");
            foreach (var p in myPreferences.GetSelectablePrefences())
                Console.WriteLine(p);
            Console.WriteLine("Done");
            Console.ReadLine();
        }
    }
命名空间试用
{
使用制度;
使用System.Collections.Generic;
[旗帜]
公共枚举首选项
{
无=0,
冒险=1,
浪漫=2,
警察=4,
科幻=8
}
公共静态类PreferedGenresExtensions
{
public static PreferedGenres AddPreference(此PreferedGenres current,PreferedGenres toAdd)
{
返回电流| toAdd;
}
公共静态PreferedGenres RemovePreference(此PreferedGenres当前,PreferedGenres toRemove)
{
返回电流&~(toRemove);
}
公共静态IEnumerable GetSelectedPreferences(此PreferedGenres类型)
{
foreach(Enum.GetValues中的PreferedGenres g(typeof(PreferedGenres)))
if(genres.hasvag(g)和&g!=PreferedGenres.None)
收益率g;
}
公共静态IEnumerable GetSelectablePrefences(此PreferedGenres类型)
{
foreach(Enum.GetValues中的PreferedGenres g(typeof(PreferedGenres)))
if(!genres.hasvag(g))
收益率g;
}
}
班级计划
{
公共静态void Main(参数字符串[]args)
{
var myPreferences=PreferedGenres
没有一个
.AddPreference(PreferedGenres.scfi)
.AddPreference(PreferedGenres.冒险);
Console.WriteLine(“我的首选项:”);
foreach(myPreferences.GetSelectedPreferences()中的var p)
控制台写入线(p);
Console.WriteLine(“可供选择:”);
foreach(myPreferences.getSelectablePreferences()中的var p)
控制台写入线(p);
控制台。写入线(“完成”);
Console.ReadLine();
}
}

关于向量,我想你指的是数组或列表?这太简单了,因为….?还有,你考虑过使用
标志
枚举吗?你想过标志吗?看看我这里的答案@BradleyDotNET是的。我厌倦了它们。我想要一些其他困难的东西。@NadiaChibrikova我还没有学会标志,但我现在就试试看。看起来很简单。嗯…just因为有些事情是“容易的”不要让它成为错误的事情。KISS代表保持简单愚蠢。对不起,我不同意这种说法:)@DiogoMartinho我真诚地希望我永远不必处理你的生产代码。仅仅因为你可以让事情变得更难或更复杂只会导致更多的工作/麻烦/错误。@BradleyDotNETgs是我真正喜欢的东西。那只是我的生活方式。@DiogoMartinho显然你不会同意我的观点,但请尝试学习如何把事情做好,而不仅仅是“复杂”.而且越简单越好。这来自于一个真正以此为生的人。@BradleyDotNET我相信你,先生。我做的事情尽可能简单。我制作结构的方式很简单,我只是想了解一些关于如何制作的新想法,一些我不知道的东西,例如旗帜。我从来没有与他们合作过,在我的观点中struct比flag简单得多。我只是,不能停止学习新的做事方式,这是这篇文章的主要原因。这也是一个想法,但我认为struct会比它短。我唯一遗憾的是,声明时结构不能有默认值,另一方面,类的实例可以!不过,谢谢你!