在类属性中组织实例的元素

时间:2015-03-23 22:59:17

标签: c# .net

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

例如,现在我将类的属性定义为结构。

public struct PrefGenres
{
    public bool adventure, romance, police, scifi;
}

在创建Client类的新元素之前,我创建了一个PrefGenres的新结构,并将所有元素定义为false,在读取用户选中的复选框之后,我将其更改为true选择的类型。

然后我将它作为参数发送到Client实例。 我想知道的是,如果有更好的方法可以做到这一点,如果有,我该如何编码呢?​​

我一直在考虑使用枚举,但是检查这些值真的很痛苦。我看到它的唯一方法是将枚举作为一个字符串,然后在该字符串中查看是否有逐个类型。

我不想要矢量!这很容易!

提前致谢!

4 个答案:

答案 0 :(得分:1)

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

不确定你的意思:

  

我不想要矢量!这很容易!

“解决方案应尽可能简单,但不能简单。”向爱因斯坦道歉

答案 1 :(得分:1)

我认为由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();
        }
    }

答案 2 :(得分:0)

我不使用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,看起来像:

在您的模型(客户端)中,应该看一下

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

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

答案 3 :(得分:0)

或者也许创建一个带有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
 };

:)