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会比它短。我唯一遗憾的是,声明时结构不能有默认值,另一方面,类的实例可以!不过,谢谢你!