Выберите объединение между коллекциями с помощью linq

#c# #linq

#c# #linq

Вопрос:

У меня есть две коллекции, каждая коллекция имеет тип ** Model Object **, **Type Object **, ** Version Object **, и мне нужно получить список **ConcateName Object ** с помощью linq, этот объект имеет объединение 2 имен типа, модели и версии плюс список сведений о каждом имени (подробности в разделе Классы):

Классы

 class Model
{
    public string name { get; set; } // Exemple: "M1"
    public string Id { get; set; }  // Exemple:  "codeM1"
}

class Type
{
    public string name { get; set; }  // Exemple: "T1"
    public string Id { get; set; }  // Exemple: "codeT1"
}

class Version
{
    public string name { get; set; } // Exemple: "V1"
    public string Id { get; set; }  // Exemple:  "codeV1"
}

class ConcateName
{
    public string ConcateName { get; set; } // exemple:  "M1 T1"
    public List<ConcateNameInfo> ConcateNameInfos { get; set; }
}

class ConcateNameInfo
{
    public Guid TechnicalId { get; set; }
    public string Criteria { get; set; }  "M1"
    public Guid ValueId { get; set; }  "CodeM1"
}
  

Список моделей

 var models = new List<Model>();
var model1 = new Model(){name ="M1", id= "CodeM1"};
var model2 = new Model(){name ="M2", id= "CodeM2"};
models.Add(model1);
models.Add(model2);
  

Список типов

 var types = new List<Type>();
var type1 = new type(){name ="T1", id= "CodeT1"};
var type2 = new type(){name ="M2", id= "CodeT2"};
models.Add(type1);
models.Add(type2);
  

Список версий

 var versions = new List<Version>();
var version1 = new Version(){name ="V1", id= "CodeV1"};
var type2 = new Version(){name ="V2", id= "CodeV2"};
models.Add(type1);
models.Add(type2);
  

На ВЫХОДЕ БУДЕТ 12 объектов с именем объединения

         var ConcateName1 = new ConcateName()
{
    ConcateName = "M1 P1",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "M1",
                                                            ValueId = "codeM1"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "T1",
                                                        ValueId     = "codeT1"
                                                        }
    }
}

var ConcateName2 = new ConcateName()
{
    ConcateName = "M1 P2",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "M1",
                                                            ValueId = "codeM1"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "T2",
                                                        ValueId     = "codeT2"
                                                        }
    }
}

var ConcateName3 = new ConcateName()
{
    ConcateName = "M2 P1",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "M2",
                                                            ValueId = "codeM2"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "T1",
                                                        ValueId     = "codeT1"
                                                        }
    }
}


var ConcateName4 = new ConcateName()
{
    ConcateName = "M2 P2",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "M2",
                                                            ValueId = "codeM2"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "T2",
                                                        ValueId     = "codeT2"
                                                        }
    }
}




var ConcateName5 = new ConcateName()
{
    ConcateName = "M1 V1",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "M1",
                                                            ValueId = "codeM1"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "V1",
                                                        ValueId     = "codeV1"
                                                        }
    }
}

var ConcateName6 = new ConcateName()
{
    ConcateName = "M1 V2",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "M1",
                                                            ValueId = "codeM1"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "V2",
                                                        ValueId     = "codeV2"
                                                        }
    }
}

var ConcateName7 = new ConcateName()
{
    ConcateName = "M2 V1",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "M2",
                                                            ValueId = "codeM2"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "V1",
                                                        ValueId     = "codeV1"
                                                        }
    }
}


var ConcateName8 = new ConcateName()
{
    ConcateName = "M2 V2",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "M2",
                                                            ValueId = "codeM2"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "T2",
                                                        ValueId     = "codeV2"
                                                        }
    }
}


var ConcateName9 = new ConcateName()
{
    ConcateName = "T1 V1",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "T1",
                                                            ValueId = "codeT1"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "V1",
                                                        ValueId     = "codeV1"
                                                        }
    }
}

var ConcateName10 = new ConcateName()
{
    ConcateName = "T1 V2",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "T1",
                                                            ValueId = "codeT1"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "V2",
                                                        ValueId     = "codeV2"
                                                        }
    }
}

var ConcateName11 = new ConcateName()
{
    ConcateName = "T2 V1",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "T2",
                                                            ValueId = "codeT2"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "V1",
                                                        ValueId     = "codeV1"
                                                        }
    }
}


var ConcateName12 = new ConcateName()
{
    ConcateName = "T2 V2",
    ConcateNameInfos = new List<ConcateNameInfo>() {
                                                        new ConcateNameInfo
                                                        {
                                                            TechnicalId = Guid.newGuid(),
                                                            Criteria = "T2",
                                                            ValueId = "codeT2"
                                                        },

                                                        new ConcateNameInfo
                                                        {
                                                             TechnicalId = Guid.newGuid(),
                                                        Criteria    = "T2",
                                                        ValueId     = "codeV2"
                                                        }
    }
}
  

Ответ №1:

 var output = models.SelectMany(m => types.Select(t => new ConcateName
{
    ConcateName = m.Name   " "   t.Name,
    ConcateNameInfos = new List<ConcateNameInfo>
    {
        new ConcateNameInfo
        {
            TechnicalId = Guid.NewGuid(),
            Criteria = m.Name,
            ValueId = m.Id
        },
        new ConcateNameInfo
        {
            TechnicalId = Guid.NewGuid(),
            Criteria = t.Name,
            ValueId = t.Id
        }
    }
});
  

Для произвольного количества классов вам нужно будет ввести интерфейс:

 interface IHasNameAndId
{
    string Name { get; }
    string Id { get; }
}
  

Затем вы можете вычислить декартово произведение:

 public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(
    this IEnumerable<IEnumerable<T>> enumerables)
{
    return enumerables.Aggregate
    (
        new [] { Enumerable.Empty<T>() }.AsEnumerable(),
        (accumulator, enumerable) =>
            accumulator.SelectMany(x => enumerable.Select(x.Append))
    );
}
  

Которые могут быть спроецированы в вашу требуемую структуру:

 var lists = new IHasNameAndId[] { models, types, //...
var output = lists
    .CartesianProduct()
    .Select(x => new ConcateName
    {
        ConcateName = string.Join(" ", x.Select(y => y.Name)),
        ConcateNameInfos = x.Select(y => new ConcateNameInfo
        {
            TechnicalId = Guid.NewGuid(),
            Criteria = y.Name,
            ValueId = y.Id
        })
        .ToList()
    });
  

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

1. Привет @JohnathanBarclay спасибо за ваш ответ, что, если у нас есть 4 класса: Модель, Тип и два других класса, такие же, как модель и Тип

2. @Sacamoto Я расширил свой ответ.