如何根据int的位组合/连接数组的元素?

时间:2012-02-03 23:02:36

标签: c#

我想基于输入int值连接字符串(来自数组)。

例如:

int Input = 3;
string[] Items = {"A", "B", "C", "D"};
// output = "A, B"

// example 2: input = 8
// output = "D"

数组的第一个元素(0)应该与输入值的最低有效位相关联。数组中的值与字符串连接,例如“,”或“+”。

这样做的好方法是什么?

4 个答案:

答案 0 :(得分:4)

那么,您想将输入值视为位掩码吗?

这应该有效:

int Input = 3;
string[] Items = {"A", "B", "C", "D"};

var bitMask = new BitArray(new[]{Input});
return Items.Where((c,i)=>bitMask.Get(i)).ToArray();

基本上我正在做的是将您的号码转换为BitArray,这样我就可以轻松告诉您设置了哪些位而不是您的号码。然后我根据是否设置了BitArray的相应索引,使用一个小Linq按索引过滤Items数组。

了解这只有在数组小于sizeof(int)* 8(32)元素时才有效。除此之外,BitArray不会有Get()索引,除非您指定可以在传递给BitArray构造函数的int []数组中链接在一起的其他整数值。

答案 1 :(得分:2)

var sb = new StringBuilder();
int input = 3;
for(int i=0; i<items.Length && input != 0; i++) {
    if((input & 1) == 1) {
        if(sb.Length > 0) sb.Append(',');
        sb.Append(items[i]);
    }
    input >>= 1;
}

答案 2 :(得分:0)

您可以使用算术模2确定整数的最低有效位。

3 % 2 => 1
4 % 2 => 0

一旦确定了整数的最低有效位,就可以通过将整数除以2来丢弃最低有效位。

3 / 2 => 1
4 / 2 => 2

丢弃最低有效位后,可以再次使用模数运算符来获得新的最低有效位。将其包裹在循环中并完成。

答案 3 :(得分:0)

如果数组不是绝对必要的,你可以使用枚举:

[Flags]
enum Items
{
    A = 1,
    B = 2,
    C = 4,
    D = 8
}

然后使用:

string GetItems(int items)
{
    string[] itemList = new string[4];
    int currPos = 0;

    foreach (Items item in Enum.GetValues(typeof(Items)))
    {
        if ((items & (int)item) == (int)item)
        {
            itemList[currPos] = item.ToString();
            currPos++;
        }
    }

    return String.Join(",", itemList, 0, currPos);
}