Найдите ниже пример с незначительными изменениями для повышения надежности, предполагая, что список ввода нельзя очистить:
Более подробная информация доступна на https://docs.microsoft.com/en-us/dotnet/csharp/linq/perform-left-outer-joins.
--- Вывод (консольное приложение) ---
John -> 10.0.0.5
Sally -> 10.0.0.7
Sally -> 10.0.0.9
Sally -> -
<Unknown User> -> 10.1.1.100
<Unknown User> -> -
<Unknown User> -> -
--- Классы ---
class Person
{
public string Name { get; set; }
}
class Client
{
public string OwnerName { get; set; }
public string Ip { get; set; }
}
- - Запрос LINQ ---
List<Person> people = new List<Person>{
new Person { Name = "John" },
new Person { Name = "Mary" },
new Person { Name = "Sally" },
new Person { Name = null },
null
};
List<Client> machines = new List<Client>{
new Client { OwnerName = "John", Ip = "10.0.0.5" },
new Client { OwnerName = "Sally", Ip = "10.0.0.7" },
new Client { OwnerName = "Sally", Ip = "10.0.0.9" },
new Client { OwnerName = "Sally", Ip = null }, // Sally -> -
new Client { OwnerName = null, Ip = "10.1.1.100" }, // <Unknown User> -> 10.1.1.100
new Client { OwnerName = null, Ip = null }, // <Unknown User> -> -
null // <Unknown User> -> -
};
if (people != null && machines != null)
{
var query = from machine in machines
join person in people on machine?.OwnerName equals person?.Name into gj
select new { Name = machine?.OwnerName?? "<Unknown User>", Ip = machine?.Ip ?? "-" };
foreach (var result in query)
{
Console.WriteLine($"{result.Name} -> {result.Ip}");
}
}