我有这个对象
[Serializable]
public class Modulo
{
[Key]
// ReSharper disable once UnusedAutoPropertyAccessor.Global
public int Id { get; set; }
public string Nombre { get; set; }
public string ClaseFontAwesome { get; set; }
}
模数是按用户划分的,因此一个用户可以拥有多个模块。
所以我需要知道如何使用模数列表创建这个元组:
Tuple<string, List<Modulo>> modulosPorUsuarioDeDirectorioActivo;
不要过于担心下面代码的技术细节,我只有一个带有架构扩展(自定义属性)的azure活动目录,该架构扩展以这种格式为一个用户保存模块:1,2,5 7
var extPropLookupNameModulos = $"extension_{SettingsHelper.ClientId.Replace("-", "")}_{"Modulos"}";
var client = AuthenticationHelper.GetActiveDirectoryClient();
var user = await client.Users.GetByObjectId(identityname).ExecuteAsync();
var userFetcher = (User)user;
var unitOfWork = new UnitOfWork();
var keyvaluepairModulos = userFetcher
.GetExtendedProperties()
.FirstOrDefault(prop => prop.Key == extPropLookupNameModulos);
var idsModulos = keyvaluepairModulos.Value.ToString().Split(',');
foreach (var idModulo in idsModulos)
{
var modulo =
unitOfWork.ModuloRepository.GetById(Convert.ToInt32(idModulo));
}
但我不知道如何在foreach中创建Tuple对象。
答案 0 :(得分:2)
在c#中,您创建Tuples
的方式与创建任何对象的方式相同。
var tuple = new Tuple<string, List<Modulo>>("string", new List<Modulo>());
https://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
答案 1 :(得分:2)
在程序上,您将创建一个List<Modulo>
并在for
循环中填充它,为每个Modulo
添加id
个实例,然后在循环后创建元组。
但更简单的方法(好吧,无论如何更少打字)可能是使用LINQ; Select
方法可以将每个id投影到Modulo实例中:
// split the string into an array of int ids
var idsModulos = keyvaluepairModulos.Value.ToString().Split(',');
// project each id into a modulo instance
var listOfModulos = idsModulos
.Select(id => unitOfWork.ModuloRepository.GetById(Convert.ToInt32(id)))
.ToList();
// it's simpler to use Tuple.Create instead of the Tuple constructor
// because you don't need to specify generic arguments in that case (they are infered)
var tuple = Tuple.Create(name, listOfModulos);