如何创建<string,list <myobject =“”>&gt;的元组来自带有逗号分隔ID的数据源

时间:2015-08-04 20:46:15

标签: c# asp.net asp.net-mvc

我有这个对象

 [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对象。

2 个答案:

答案 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);