Как объединить список строк и список классов в новый список классов, где все элементы являются однозначными на основе списка строк, но также используют описание из второго списка, если соответствующий элемент существует? Вот моя первая попытка:
namespace TestListMerge
{
public class FooClass
{
public string Code { get; set; }
public string? Description { get; set; }
}
public class ProcessLists
{
List<string> FooCodes = new List<string>()
{
"1", "2", "3", "4"
};
List<FooClass> FooClasses = new List<FooClass>()
{
new FooClass { Code = "5" , Description = "Desc 5" },
new FooClass { Code = "2" , Description = "Desc 2" },
new FooClass { Code = "3" , Description = "Desc 3" }
};
public IEnumberable<FooClass> MergeLists()
{
var returnList = new IEnumberable<FooClass>()
returnList = FooCodes
.ForEach(x => x)
.Select(new FooClass()
{
Code = x,
Description = (FooClasses.Contains(y => y.Code = x)
? y.Description
: null
}
);
return returnList;
}
}
}
var gerenate = new ProcessLists();
var combinedList = gerenate.MergeLists();
Это помогает начать с правильной терминологии, и, насколько я могу судить, вы хотите присоединиться к ним, а не объединить их. Информации о том, как это сделать, предостаточно.





В этом конкретном случае вы можете превратить FooClasses в словарь и использовать его (особенно если в FooClasses много элементов). Также обратите внимание, что эта операция является соединением (точнее — левым соединением), а не слиянием:
public IEnumerable<FooClass> JoinData()
{
var dictionary = FooClasses.ToDictionary(f => f.Code, f => f.Description);
List<FooClass> returnList = FooCodes
.Select(x => new FooClass()
{
Code = x,
Description = dictionary.GetValueOrDefault(x, "")
}
)
.ToList();
return returnList;
}
также вы можете использовать linq (левое соединение)
Если информация совпадает, то считывают из второй таблицы, иначе описание пустое
public IEnumerable<FooClass> MergeLists()
{
return
from f in FooCodes
join fc in FooClasses on f equals fc.Code into fcn
from p in fcn.DefaultIfEmpty()
select new FooClass
{
Code = f,
Description = p == null ? "" : p.Description
};
}
Каким образом ваша попытка не работает должным образом? На первый взгляд кажется, что в использовании
Select()есть опечатка, так как вы не передаете функцию обратного вызова, а просто передаете объект. Это та проблема, с которой вы столкнулись?