簡體   English   中英

如何使用 C# 迭代當前為字符串的數組並在我的 ASP.NET Core 應用程序中添加其他值?

[英]How do I iterate over an array that's currently a string using C# and add additional values in my ASP.NET Core Application?

我在我的 Web 應用程序中使用 KendoUI。 我們的一個數據庫表將一組值作為varchar存儲在單個列中。 每個人對此都有自己的看法,但目前我必須接受它。

數據庫服務器

Office_Ids
1,2,3,4,5

我的任務是將辦公室名稱加入這些 ID,並使這些 ID 在網格中更好(樣式化)。 問題是,作為一個字符串是不可變的,所以它開始變得非常復雜。

期望的結果如下:

"<OfficeId>1</OfficeId><OfficeName>Some Name</OfficeName><OfficeId>2</OfficeId><OfficeName>Some Name</OfficeName>"

上述結果還假設我將數據加入到 office 表中。 如果數據存儲在單獨的表中,通常我會使用正則表達式完成類似上面的操作。 事實上,這不是造成混亂的原因。

這是我的控制器,這只是我嘗試解決此問題時的測試控制器操作。 你會看到我在這里做了幾件事:

  • 調用我的存儲庫以獲取數據

  • 創建兩個列表,一個用於辦公室,另一個稱為test用於嘗試將上述代碼項添加到字符串中。

  • 我從Office_Ids列中拆分 office Id 數組並返回到列表

  • 然后我遍歷該列表並嘗試使用字符串插入來彈出這些標簽

    public IQueryable Read() { IQueryable data = _company.GetAll();

     List<string> office_item = new List<string>(); List<string> test = new List<string>(); foreach (var item in data) { office_item = item.Office_Ids .Split(',') .Select(x => x.Trim('"')) .Select(x => x.Trim(' ')).ToList(); foreach (var office in office_item ) { client.Insert(0, "<OfficeId>"); client.Insert(2, "</OfficeId>"); test.Add(client); } } Console.WriteLine(test); return data; }

問題

  • 這真的不太好用
  • 我永遠不會知道 Office Id 有多長,因此如果它們的長度為 4 個數字,則此插入方法將不起作用。
  • 我需要將這些值作為模型的一部分返回到我的網格中,它目前沒有這樣做,最后
  • 我仍然需要將辦公桌加入這些 ID。

CompanyReview的模型如下所示:

namespace MyCompany.Data
{
    public class OfficeReview : BaseEntity
    {
        
        public string Office_Ids { get; set; }            
    }
}

我想我已經涵蓋了這里的所有內容,但 TL:DR 是我需要分離一個字符串,它是一個值數組,向它添加一些開始和結束標簽,然后將它作為我的模型的一部分返回到網格。 之后,我將使用一些正則表達式使其看起來不錯。

考慮使用XElement 它非常適合使用 Linq 查詢的 XML 構造和操作。

var officeItems = new List<string> { "1, 2, 42, 12313", "2, 5, 234", "1" };

var officeIdElements = officeItems
    .SelectMany(s => s.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries))
    .Select(id => new XElement("OfficeId", id));

//The output you requested
string officeIds = string.Concat(officeIdElements.Select(idElement => idElement.ToString()));

但是,如果您想對此進行擴展以包含其他元素,例如OfficeName ,那么您可以這樣做

var officeElements = officeIdElements.Select(idElement =>
{
    var officeName = $"Office { idElement.Name }";
    var officeNameElement = new XElement("OfficeName", officeName);
    return new XElement("Office", idElement, officeNameElement);
});

如果您需要將其包裝在父節點下以獲得格式良好的 XML

var officesElement = new XElement("Offices", officeElements);

/*
<Offices>
  <Office>
    <OfficeId>1</OfficeId>
    <OfficeName>Office OfficeId</OfficeName>
  </Office>
  <Office>
    <OfficeId>2</OfficeId>
    <OfficeName>Office OfficeId</OfficeName>
  </Office>
  <Office>
    <OfficeId>42</OfficeId>
    <OfficeName>Office OfficeId</OfficeName>
  </Office>
  <Office>
    <OfficeId>12313</OfficeId>
    <OfficeName>Office OfficeId</OfficeName>
  </Office>
  <Office>
    <OfficeId>2</OfficeId>
    <OfficeName>Office OfficeId</OfficeName>
  </Office>
  <Office>
    <OfficeId>5</OfficeId>
    <OfficeName>Office OfficeId</OfficeName>
  </Office>
  <Office>
    <OfficeId>234</OfficeId>
    <OfficeName>Office OfficeId</OfficeName>
  </Office>
  <Office>
    <OfficeId>1</OfficeId>
    <OfficeName>Office OfficeId</OfficeName>
  </Office>
</Offices>
*/

如果必須輸出字符串,以下方法可能有效:

var officeItems = new List<string> { "1, 2, 42, 12313", "2, 5, 234", "1" };
var officeResults = new List<string>();

foreach (var officeItem in officeItems)
{
    foreach (var item in officeItem.Replace(" ", string.Empty).Split(","))
    {
        var officeName = service.GetOfficeName(item);

        officeResults.Add($"<OfficeId>{item}</OfficeId><OfficeName>{officeName}</OfficeName>");
    }
}

暫無
暫無

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

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