Как мне выполнить итерацию по массиву, который в настоящее время является строкой, используя C#, и добавить дополнительные значения в мой ASP.NET Основное приложение?

#c# #asp.net-core #kendo-ui

Вопрос:

Я использую кендуи в своем веб-приложении. Одна из таблиц нашей базы данных содержит массив значений, хранящихся в одном столбце в виде varchar . У каждого есть свое мнение на этот счет, но в данный момент я должен с этим работать.

SQL Server

 Office_Ids 1,2,3,4,5  

Мне было поручено объединить названия офисов с этими идентификаторами, а также сделать эти идентификаторы более приятными(стилизованными) в сетке. Проблема в том, что, как строка, они неизменяемы, и поэтому все это начинает становиться очень сложным.

Желаемым результатом было бы следующее:

 "lt;OfficeIdgt;1lt;/OfficeIdgt;lt;OfficeNamegt;Some Namelt;/OfficeNamegt;lt;OfficeIdgt;2lt;/OfficeIdgt;lt;OfficeNamegt;Some Namelt;/OfficeNamegt;"  

Приведенный выше результат также предполагает, что я присоединяю данные к таблице office. Обычно я выполнял бы что-то подобное выше, используя регулярное выражение, если бы данные хранились в отдельных таблицах. Тот факт, что это не так, и является причиной путаницы.

Вот мой контроллер, это всего лишь тестовое действие контроллера на данный момент, когда я пытался разобраться в этом. Вы увидите, что я кое-что здесь делаю:

  • Позвоните в мой репозиторий, чтобы получить данные
  • Создайте два списка, один для офисов, а другой test для попыток добавить вышеупомянутые элементы кода в строки.
  • Я разделяю массив идентификаторов офиса из Office_Ids столбца и возвращаюсь к списку
  • Затем я повторяю этот список и пытаюсь использовать строковые вставки для вставки этих тегов

    общедоступное IQueryable чтение() { IQueryable данные = _компания.GetAll();

     Listlt;stringgt; office_item = new Listlt;stringgt;();  Listlt;stringgt; test = new Listlt;stringgt;();   foreach (var item in data)  {  office_item = item.Office_Ids  .Split(',')  .Select(x =gt; x.Trim('"'))  .Select(x =gt; x.Trim(' ')).ToList();   foreach (var office in office_item ) {  client.Insert(0, "lt;OfficeIdgt;");  client.Insert(2, "lt;/OfficeIdgt;");  test.Add(client);  }   }   Console.WriteLine(test);    return data;  }   

Проблемы

  • На самом деле это работает не очень хорошо
  • Я никогда не узнаю, какой длины идентификатор офиса, и поэтому, если они когда-либо будут иметь длину 4 номера, этот подход к вставке не сработает.
  • Мне нужно вернуть эти значения в мою сетку как часть модели, чего она в данный момент не делает, и, наконец,
  • Мне все еще нужно подключить офисный стол к этим идентификаторам.

Модель для CompanyReview выглядит следующим образом:

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

Я думаю, что я рассмотрел здесь все, но суть в том, что мне нужно отделить строку, представляющую собой массив значений, добавить к ней несколько открывающих и закрывающих тегов, а затем вернуть ее как часть моей модели в сетку. После этого я использую какое-нибудь регулярное выражение, чтобы оно выглядело красиво.

Комментарии:

1. Возможно, вы захотите рассмотреть возможность сериализации этого с помощью XML-сериализатора, который, я думаю, достигнет вашего результата.

Ответ №1:

Подумайте об использовании XElement . Он очень хорошо подходит для построения XML и обработки с использованием запросов Linq.

 var officeItems = new Listlt;stringgt; { "1, 2, 42, 12313", "2, 5, 234", "1" };  var officeIdElements = officeItems  .SelectMany(s =gt; s.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries))  .Select(id =gt; new XElement("OfficeId", id));  //The output you requested string officeIds = string.Concat(officeIdElements.Select(idElement =gt; idElement.ToString()));  

Однако, если вы хотите расширить это, чтобы включить , скажем, другие элементы OfficeName , то вы могли бы сделать

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

и если вам нужно завернуть его под родительский узел для хорошо сформированного XML

 var officesElement = new XElement("Offices", officeElements);  /* lt;Officesgt;  lt;Officegt;  lt;OfficeIdgt;1lt;/OfficeIdgt;  lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt;  lt;/Officegt;  lt;Officegt;  lt;OfficeIdgt;2lt;/OfficeIdgt;  lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt;  lt;/Officegt;  lt;Officegt;  lt;OfficeIdgt;42lt;/OfficeIdgt;  lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt;  lt;/Officegt;  lt;Officegt;  lt;OfficeIdgt;12313lt;/OfficeIdgt;  lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt;  lt;/Officegt;  lt;Officegt;  lt;OfficeIdgt;2lt;/OfficeIdgt;  lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt;  lt;/Officegt;  lt;Officegt;  lt;OfficeIdgt;5lt;/OfficeIdgt;  lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt;  lt;/Officegt;  lt;Officegt;  lt;OfficeIdgt;234lt;/OfficeIdgt;  lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt;  lt;/Officegt;  lt;Officegt;  lt;OfficeIdgt;1lt;/OfficeIdgt;  lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt;  lt;/Officegt; lt;/Officesgt; */  

Ответ №2:

Если вам нужно вывести строку, может сработать следующий подход:

 var officeItems = new Listlt;stringgt; { "1, 2, 42, 12313", "2, 5, 234", "1" }; var officeResults = new Listlt;stringgt;();  foreach (var officeItem in officeItems) {  foreach (var item in officeItem.Replace(" ", string.Empty).Split(","))  {  var officeName = service.GetOfficeName(item);   officeResults.Add($"lt;OfficeIdgt;{item}lt;/OfficeIdgt;lt;OfficeNamegt;{officeName}lt;/OfficeNamegt;");  } }