linq 对列表执行按位与运算,并将值转换为逗号分隔的字符串

mzmfm0qo  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(314)

我有一个返回ID、类型和值的列表。ID以2的幂存储。示例数据如下

var _data = await _context.clubs.Where(x => x.Type == "NewTown").ToListAsync();

| 识别码|型号|数值|
| - -|- -|- -|
| 一个|纽敦|测试1|
| 2个|纽敦|测试2|
| 四个|纽敦|测试3|
我有一个视图模型,它通过添加ID来存储此表中的ID,例如,如果我选择first和third,它将保存5;类似地,如果我选择first和second,它将保存3。
这些值将保存在不同的表中,我不能将Id存储为逗号分隔的值,因为它最终将作为令牌发送,如果我有许多字段,令牌将超过长度,这就是为什么我保存Id的总和。
现在我想做的是,在显示这些值的同时,如果保存了5,我想显示Test1,Test 3,现在我知道了,如果我对数组和所选的值进行一个位与运算,它会给予我如下例所示的值。

var savedVal= 5;
var testArray = new int[] {1,2,4,8,16,32,64,128};
testArray .Select(x => new { savedVal= x, Enabled = ((savedVal & x) > 0) }).Dump();

| 保存值|已启用|
| - -|- -|
| 一个|正确|
| 2个|错误|
| 四个|正确|
| 八个|错误|
| 十六|错误|
| 三十二|错误|
| 六十四|错误|
| 一百二十八|错误|
这将为所选的值给予启用的“true”。
现在,我想知道的是,如何在我的列表场景中实现这一点,在该场景中,我的列表中有3个字段,我希望将启用字段的值作为逗号分隔的字符串,如我分享的示例中的“Test1,Test 3”。

fd3cxomn

fd3cxomn1#

使用Linq:JoinWhereSelectToArray,与String.Join一起使用,通过联接返回的savedVals列表(其中Enabled = true

//a test object to simulate your DBContext
var testdbcontext = new List<dynamic> 
{ 
    new { Id = 1, Type = "NewTown", Value = "Test1" }, 
    new { Id = 2, Type = "NewTown", Value = "Test2" }, 
    new { Id = 4, Type = "NewTown", Value = "Test3" }
};

var savedVal= 5;
var testArray = new int[] {1,2,4,8,16,32,64,128};

Console.WriteLine(String.Join(",", 
    testdbcontext
   .Join(testArray.Select(x => new { savedVal= x, Enabled = ((savedVal & x) > 0) })
   .Where(b => b.Enabled)
   .Select(c => c.savedVal),
                a => a.Id,
                b => b,
                (a, b) => new string (a.Value)).ToArray()));

打印:

//Test1,Test3
ezykj2lf

ezykj2lf2#

前面的答案肯定是正确的,buy可能对初学者来说有点混乱/太复杂了。你实际上只错过了String.Join方法来实现你的目标。我的代码版本来解决你的问题是:

...(your code)

var _data = await _context
    .clubs
    .Where(x => x.Type == "NewTown")
    .Where (x => (savedVal & x) > 0)
    .ToListAsync();

resultString = String.Join(',', _data.Select(x => x.Value));

相关问题