C# 如何基于int的位组合/连接数组的元素?

C# 如何基于int的位组合/连接数组的元素?,c#,C#,我想根据输入int值连接字符串(来自数组) 例如: int Input = 3; string[] Items = {"A", "B", "C", "D"}; // output = "A, B" // example 2: input = 8 // output = "D" 数组(0)的第一个元素应与输入值的最低有效位相关联。数组中的值用字符串连接,如“,”或“+” 这样做的好方法是什么?var sb=new StringBuilder(); var sb = new StringBuil

我想根据输入int值连接字符串(来自数组)

例如:

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

// example 2: input = 8
// output = "D"
数组(0)的第一个元素应与输入值的最低有效位相关联。数组中的值用字符串连接,如“,”或“+”

这样做的好方法是什么?

var sb=new StringBuilder();
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;
}
int输入=3; 对于(inti=0;i0)sb.Append(','); 某人附加(项目[i]); } 输入>>=1; }
var sb=new StringBuilder();
int输入=3;
对于(inti=0;i0)sb.Append(',');
某人附加(项目[i]);
}
输入>>=1;
}

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

这应该起作用:

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

var bitMask = new BitArray(new[]{Input});
return Items.Where((c,i)=>bitMask.Get(i)).ToArray();
基本上,我正在做的是将你的数字转换成一个位数组,这样我就可以很容易地知道你的数字中设置了哪些位,哪些位没有设置。然后,我使用一点Linq,根据是否设置了BitArray的相应索引,按索引过滤Items数组


请理解,只有当数组的元素数小于sizeof(int)*8(32)个时,这才有效。除此之外,除非您在传递给BitArray构造函数的int[]数组中指定可以链接在一起的其他整数值,否则BitArray将没有要获取的索引()

这应该起作用:

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

var bitMask = new BitArray(new[]{Input});
return Items.Where((c,i)=>bitMask.Get(i)).ToArray();
基本上,我正在做的是将你的数字转换成一个位数组,这样我就可以很容易地知道你的数字中设置了哪些位,哪些位没有设置。然后,我使用一点Linq,根据是否设置了BitArray的相应索引,按索引过滤Items数组


请理解,只有当数组的元素数小于sizeof(int)*8(32)个时,这才有效。除此之外,除非您在传递给BitArray构造函数的int[]数组中指定可以链接在一起的其他整数值,否则BitArray将没有要获取的索引()

3 % 2 => 1
4 % 2 => 0
一旦确定了整数的最低有效位,就可以通过将整数除以2来丢弃最低有效位

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

丢弃最低有效位后,可以再次使用模运算符获取新的最低有效位。将其包装在一个循环中,就完成了。

您可以使用算术模2识别整数的最低有效位

3 % 2 => 1
4 % 2 => 0
一旦确定了整数的最低有效位,就可以通过将整数除以2来丢弃最低有效位

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

丢弃最低有效位后,可以再次使用模运算符获取新的最低有效位。将其包装在一个循环中,您就完成了。

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

[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);
}

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

[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);
}


我想是用
StringBuilder
和一点移位。你自己试过什么吗?我建议你先试试,然后拿着你有的回来。你必须使用数组吗?为什么不使用标记属性修饰的枚举,该属性的枚举名为a、B、C…?@Ken我从字符串开始。Join和LINQ,但我不确定如何使用LINQ执行任何逐位操作。我想使用
StringBuilder
和位移位。你自己尝试过什么吗?我建议你先试试,然后拿着你有的回来。你必须使用数组吗?为什么不使用标记属性修饰的枚举,该属性的枚举名为a、B、C…?@Ken我从字符串开始。Join和LINQ,但我不确定如何对LINQ执行任何逐位操作。lambda表达式的使用很好这看起来像我想对LINQ执行的操作
BitArray
是我不知道的缺失部分。它的实际应用是针对各种“或”条件将SQL语句粘合在一起。在我的例子中,有五个语句,因此有32个可能的组合(实际上是30个,因为我使0和31无效)。感谢额外的资格声明。作为我(以及任何学习LINQ的人)的后续说明;我不熟悉在
Where
方法中使用两个参数(以前我只在
Aggregate
中使用它们)。第二个参数表示数组/集合中元素的索引@杰尔顿:是的。Where的重载和其他类似重载的Linq扩展方法允许您通过“索引”引用项。但是,买主要注意;因为Linq使用IEnumerables,所以“索引”编号只是扩展方法背后的代码生成的一个自动递增的值,并且与源集合的索引(如果有)没有固有的关系。因此,您可以使用它,例如,从集合中选择每五个项目;在已经过滤或排序之后,您无法使用它在原始集合的特定索引中查找项目。lambda expression的良好使用这看起来就像我想对LINQ所做的
BitArray
是我不知道的缺失部分。它的实际应用是针对各种“或”条件将SQL语句粘合在一起。在我的例子中,有五个语句,因此有32个可能的组合(实际上是30个,因为我使0和31无效)。感谢额外的资格声明。作为我(以及任何学习LINQ的人)的后续说明;我不熟悉在
Where
方法中使用两个参数(以前我只在
Aggregate
中使用它们)。第二个参数表示数组/集合中元素的索引@杰尔顿:是的。Where的重载和其他类似重载的Linq扩展方法允许您通过“索引”引用项。但是,买主要注意;因为Linq使用IEnumerables,所以“索引”号只是代码beh生成的一个自动递增的值