#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 Я расширил свой ответ.