我想基于输入int值连接字符串(来自数组)。
例如:
int Input = 3;
string[] Items = {"A", "B", "C", "D"};
// output = "A, B"
// example 2: input = 8
// output = "D"
数组的第一个元素(0)应该与输入值的最低有效位相关联。数组中的值与字符串连接,例如“,”或“+”。
这样做的好方法是什么?
答案 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);
}