【问题标题】:Multidimensional array sum [closed]多维数组总和 [关闭]
【发布时间】:2013-09-14 03:31:12
【问题描述】:

我有这个:

  • 猫 = 1 狗 = 2 老鼠 = 4 房子 = 8 球 = 16 音乐 = 32

如果我从 SQL = 3 中得到一个值 - 我希望输出为“Cat, Dog” 如果值 = 7,则“猫、狗、老鼠” 等等。

有什么帮助吗?

【问题讨论】:

  • 这太令人困惑了!
  • 我认为,如果您正在处理标志枚举,这将更有意义。

标签: c# asp.net arrays multidimensional-array delegates


【解决方案1】:

http://ideone.com/aPqPqE

[System.Flags]
enum Things { Cat = 1, Dog = 2, Mouse = 4, House = 8, Ball = 16, Music = 32 }

class Program
{

    static void Main()
    {

        var value = Things.Cat | Things.Dog;

        Console.WriteLine(value.ToString());
     }
}

【讨论】:

  • 太棒了!从来不知道这件事。
  • 哇,谁会否决这个答案?为什么不被接受?其他两张海报中的一张是否真的投了反对票来宣传他们的(相对低质量的)答案?不用说,公认的答案很糟糕。
【解决方案2】:

假设我们有enum Item = { Cat = 1, ... }:

StringBuilder sb = new StringBuilder();

foreach(Item i in Enum.GetValues(typeof(Item))) 
    if ((valueFromSQL & ((int)i)) != 0) {
        if (sb.Length > 0)
            sb.Append(", ");
        sb.Append(i);
    }

string result = sb.ToString();

这可以正确处理零值和单个值(例如valueFromSQL = 4)。它之所以有效,是因为值的位表示如下:

Name          Decimal   Binary

Cat           1         ...0001
Dog           2         ...0010
Mouse         4         ...0100
valueFromSQL  3         ...0011

请注意,每个 Item 值仅使用一个唯一位。当您添加这些值时,您可以有效地将这些位 OR 在一起。因此,我们可以使用按位与来测试特定值的位是否非零。

【讨论】:

  • @nietaki 我认为您仍然需要指定值。 IIRC C# 只使用顺序整数。
  • 投反对票的能解释一下吗?
【解决方案3】:

你可以使用 linq where 来检查数字是否小于或等于指定值。

Dictionary<int, string> wordList = new Dictionary<int, string> {
            {1, "Cat"},
            {2, "Dog"},
            {4, "Mouse"},
            {8, "House"},
            {16, "Ball"},
            {32, "Music"},
        };

        int number = 7;

        StringBuilder builder = new StringBuilder();
        foreach (KeyValuePair<int, string> word in 
            wordList.Where(pair => pair.Key <= number)) {
            builder.Append(word.Value);
            builder.Append(", ");
        }

【讨论】:

  • 不幸的是在这种情况下不起作用。如果 valueFromSQL = 6 可以说它不应该打印 Cat。
  • 感谢 Lambda,如果我给出奇数,效果很好,但是当我给出 2 或 8 时,我只返回猫、狗、老鼠。需要 8=房子
  • 感谢@user2778395,我将它从小于改为小于或等于它会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多