Мне кажется, что у вас есть две последовательности строк: последовательность transNumbers
и последовательность comboItems
(на самом деле это ваш transnumber_list и ваш combos_list, но я не хочу ограничивать себя факт, что они являются списками, а имена противоречивы (первое не множественное число, второе - множественное число?)
В любом случае, вы говорите, что ваша последовательность transNumbers
содержит только уникальные элементы, но ваш comboItems
может содержать дубликаты (основанные на некотором компараторе равенства строк)
Примерно так:
IEnumerable<string> transNumbers = new string[] {"1", "2"};
IEnumerable<string> comboItems = new string[] {"A", "A", "A", "B", "A", "B"};
В результате вы хотите что-то вроде:
TransNumber ComboItem
"1" "A"
"1" "B"
"2" "A"
"2" "B"
То есть вы хотите объединить все TransNumber
с каждым уникальным comboItem
. Порядок, кажется, не важен.
С LINQ Это довольно просто. Мы будем использовать Enumerable.SelectMany для объединения двух последовательностей, и мы будем использовать Enumerable.Distinct , чтобы избавиться от ваших дубликатов
// SelectMany:
// parameter source: transNumbers
// parameter collectionSelector: comboItems without Duplicates
var transNumberCombiItemCombinations = transNumbers.SelectMany(
// collectionSelector: comboItems without duplicates
combiItems.Distinct(),
// ResultSelector, take a transNumber from the source,
// and a comboItem from collectionSelector to make a new object
(transNumber, comboItem => new
{
Column1 = transNumber,
Column2 = comboItem,
});
Если вы удалите все комментарии, вы увидите, что это действительно небольшой фрагмент кода.
Distinct
удалит дубликаты. Если вы считаете "myname" и "MYNAME" равными, вам нужно указать IEqualityComparer<string>
, например StringComparer.OrdinalIgnoreCase
.
SelectMany
"сделает ваше foreach inside foreach
.
resultSelector
примет один transNumber
и один comboItem
в качестве входных данных для создания желаемого результата. В этом случае один объект имеет два свойства: Column1
и Column2
.
Результатом является IEnumerable. Все, что вам нужно сделать, это перечислить его в список или что-то еще и добавить результат в вашу коллекцию строк:
dt.Rows.AddRange(transNumberCombiItemCombinations.ToList());