我有一类图书馆的客户,每个客户可以有四种最喜欢的类型:冒险,浪漫,警察和科幻。
例如,现在我将类的属性定义为结构。
public struct PrefGenres
{
public bool adventure, romance, police, scifi;
}
在创建Client类的新元素之前,我创建了一个PrefGenres的新结构,并将所有元素定义为false,在读取用户选中的复选框之后,我将其更改为true选择的类型。
然后我将它作为参数发送到Client实例。 我想知道的是,如果有更好的方法可以做到这一点,如果有,我该如何编码呢?
我一直在考虑使用枚举,但是检查这些值真的很痛苦。我看到它的唯一方法是将枚举作为一个字符串,然后在该字符串中查看是否有逐个类型。
我不想要矢量!这很容易!
提前致谢!
答案 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
};
:)