簡體   English   中英

逐位和對列表的操作並將值轉換為逗號分隔的字符串

[英]Bit wise and operation on list and convert value to comma separated string

我有一個返回 ID、類型和值的列表。 ID 存儲為 2 的冪。下面的示例數據

var _data = await _context.clubs.Where(x => x.Type == "NewTown").ToListAsync();
ID 類型 價值
1 新城市 測試1
2 新城市 測試2
4 新城市 測試3

我有一個視圖 model ,它通過添加它們來存儲該表中的 ID,就像我第一個和第三個 select 一樣,如果我第一個和第二個 select 它會保存 5,它會類似地保存 5。

這些值將保存在另一個表中,我不能將 Id 存儲為逗號分隔值,因為它最終會作為令牌發送,如果我有很多字段,令牌會超過長度,這就是我保存總和的原因的ID。

現在我想做的是在顯示這些值時,如果保存了 5,我想顯示 Test1、Test3。 現在我知道如果我對數組和選定的值做一些明智的操作,它會給我下面這個例子的值。

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();
保存值 啟用
1 真的
2 錯誤的
4 真的
8 錯誤的
16 錯誤的
32 錯誤的
64 錯誤的
128 錯誤的

這將使我為所選值啟用“true”。

現在我想知道的是如何為我的列表場景實現這一點,其中列表中有 3 個字段,並且我希望將啟用的字段的值作為逗號分隔的字符串,例如“Test1,Test3”,例如我共享。

使用 Linq: Join , Where , Select , ToArray和 String.Join 的組合,通過加入您返回的已savedVals值列表(其中Enabled = true )從String.Join生成測試值列表

//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

前面的答案絕對正確,對於初學者來說購買可能有點混亂/太復雜。 您實際上只是錯過了 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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM