【问题标题】:One Variable, Many Values?一个变量,多个值?
【发布时间】:2018-08-24 20:30:03
【问题描述】:

这听起来像是一个奇怪的问题,我觉得简短的回答是“不”。

但是,基于布尔运算符,变量是否可以采用多个值?例如:

//Current implementation
string Variable1 = "A";
string Variable2 = "B";
string Variable3 = "C";

//Sought after implementation
string Variable = "":
Variable = "A" || Variable = "B" || Variable = "C";

这看起来不太可行,特别是因为布尔运算符不能应用于字符串类型,因为,嗯...它们不是布尔值。

【问题讨论】:

  • 我不明白是什么条件决定了分配给变量的值。
  • 也许是一个枚举?从 XY 格式很难分辨
  • 你可以有一个 int 并设置位标志,而不是字符串。
  • 你想让字符串一直保持3种可能的状态吗?还是您的意思是将其设置为 A、B 或 C,从那时起它就是那个值?对于第一个,您最好使用 3 个值创建一个对象,然后确定 3 个值中的哪一个是合适的,因为建议 Enums 做得很好。对于第二种情况,三元运算符在根据单行中的某些条件设置值方面做得很好。见stackoverflow.com/questions/6208067/operators-instead-of-ifelse

标签: c# .net


【解决方案1】:

使用 [Flags] 属性定义一个枚举。

参考:What does the [Flags] Enum Attribute mean in C#?

[Flags]
public enum PossibleValues { A = 1, B = 2, C = 4 }

var foo = PossibleValues.A | PossibleValues.B | PossibleValues.C;

【讨论】:

  • [Flags] 并不是必需的...手动编号 1、2、4、8 是必不可少的。
  • @HenkHolterman 添加了数字 :) 属性有助于工具了解发生了什么。
  • @RobertLevy 这里是一个有用的技巧,用public enum PossibleValues { A = 1<<0, B = 1<<1, C = 1<<2, D = 1<<3, ... } 标记你的枚举,它会生成 1、2、4、8,.... 但你不需要记住你的 2 的更高幂.
【解决方案2】:

但是,基于布尔运算符,变量是否可以采用多个值?

当然!让我们实现它。我们将使用来自System.Collections.ImmutableImmutableHashSet<T> 类型。

struct MySet<T>
{
    public readonly static MySet<T> Empty = default(MySet<T>);
    private ImmutableHashSet<T> items;
    private MySet(ImmutableHashSet<T> items) => this.items = items;
    public ImmutableHashSet<T> Items => this.items ?? ImmutableHashSet<T>.Empty;
    public MySet<T> Add(T item) => new MySet<T>(this.Items.Add(item));
    public static MySet<T> operator |(T item, MySet<T> items) => items.Add(item);
    public static MySet<T> operator |(MySet<T> items, T item) => items.Add(item);
    public static MySet<T> operator |(MySet<T> x, MySet<T> y) => new MySet<T>(x.Items.Union(y.Items));
    public static MySet<T> operator &(MySet<T> items, T item) => new MySet<T>(items.Items.Contains(item) ? ImmutableHashSet<T>.Empty.Add(item) : ImmutableHashSet<T>.Empty);
    public static MySet<T> operator &(T item, MySet<T> items) => new MySet<T>(items.Items.Contains(item) ? ImmutableHashSet<T>.Empty.Add(item) : ImmutableHashSet<T>.Empty);
    public static MySet<T> operator &(MySet<T> x, MySet<T> y) => new MySet<T>(x.Items.Intersect(y.Items));
}

现在我们可以创建一个包含多个任意类型值的变量,并且遵守|&amp; 的规律:

    var items1 = MySet<String>.Empty | "Hello" | "Goodbye" | "Whatever";
    var items2 = MySet<String>.Empty | "Goodbye" | "Hello" | "Blah";
    var items3 = items1 & items2;
    var items4 = items1 | items2;
    Console.WriteLine(String.Join(" ", items3.Items)); // "Hello Goodbye"
    Console.WriteLine(String.Join(" ", items4.Items)); // "Hello Goodbye Whatever Blah"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多