C # Объединение списка и обработка нулевых / пустых значений

#c# #list #linq

#c# #Список #linq

Вопрос:

У меня есть 2 списка, к которым я присоединяюсь. Список 1 содержит все IP-адреса в подсети, а список 2 содержит назначенные IP-адреса.

Оба этих списка имеют одинаковую структуру. пример ниже (удалены лишние поля):

 int IPAddress
int AssingmentType
  

В списке 1 «AssingmentType» всегда будет пустым, но в списке 2 оба поля будут заполнены, но только для назначенных IP-адресов. Я хотел бы сгенерировать полный список IP-адресов и объединить его со списком 2, показывая, когда назначен IP-адрес.

Я использую LINQ для этого и пока имею следующее

             var results = from t1 in allIPinNetwork
                      join t2 in assignedIPs on t1.IPAddressText equals t2.IPAddressText into combinedIP
                      from t3 in combinedIP.DefaultIfEmpty()
                      select new IPAddress()
                      {
                          IpAddressText = t1.IpAddressText,
                          AssingmentType = t3 == null ? 0 : t3.AssingmentType,

                      };
  

Мой вопрос в том, как лучше всего обрабатывать «нулевые» значения, которые предназначены для AssingmentType? В этом случае я установил для них значение 0, но есть ли значение null, которое я могу использовать, чтобы оставить их пустыми?
В полном классе также будут некоторые строковые поля, которые могут быть пустыми.

Рад, если у кого-нибудь есть лучший способ сделать это?

Спасибо

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

1. Использовать nullable int ?

Ответ №1:

Оба этих списка имеют одинаковую структуру.

Ну, в этом-то и проблема, похоже, у них нет структуры, в которую вы верите. Если списки могут иметь пустые AssignmentType поля, то AssignmentType они не могут иметь тип int ; int всегда должно быть значение.

Вероятно, вы хотите, чтобы оба списка имели следующую структуру:

 int IPAddress
int? AssignmentType
  

И, да, когда AssignmentType значение не установлено, оно должно быть null .

Другим вариантом может быть изменение AssignmentType на перечисление:

 enum IPAssignmentType
{
     NotAssigned,
     Dynamic,
     Static,
     //whatever
}
  

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