C# “C”;“匿名”;字典中存储的列表类型

C# “C”;“匿名”;字典中存储的列表类型,c#,dictionary,asp.net-mvc-5,anonymous-types,C#,Dictionary,Asp.net Mvc 5,Anonymous Types,我得出的结论是,这可能是不可能的,但我想在完全放弃之前,我应该先问一下。我要找的是类似的东西: Dictionary<string, List<T>> FilterLists { get; set; } 字典过滤器列表{get;set;} 我希望能够存储可能需要的任何数量的列表,然后能够通过字符串键“index”找到它们 我之所以需要它,是因为由于某些限制,它必须存储在什么地方,并且不可能将列表作为任何特定的类型键入,因为它看不到我要放入其中的对象类型。即使我可以看到

我得出的结论是,这可能是不可能的,但我想在完全放弃之前,我应该先问一下。我要找的是类似的东西:

Dictionary<string, List<T>> FilterLists { get; set; }
字典过滤器列表{get;set;}
我希望能够存储可能需要的任何数量的列表,然后能够通过字符串键“index”找到它们

我之所以需要它,是因为由于某些限制,它必须存储在什么地方,并且不可能将列表作为任何特定的类型键入,因为它看不到我要放入其中的对象类型。即使我可以看到对象类型,这也会降低它在其他项目中的可重用性,因为在这些项目中,可能有人想放在其中的内容可能会以不同的方式构造,我正试图使其尽可能可重用

我发现了这篇文章:,但这与我正在尝试的工作不太相符

而且,这必须放在接口类中,所以它只是一个定义

用法说明: 这专门用于MVC5应用程序中的分页结果。返回结果列表,但我还希望在某些标题列中使用下拉过滤器(就像您在Excel列筛选中看到的那样)

出于几个原因,我尽量避免使用ViewBag。我不喜欢用它。 我的“分页”代码位于一个项目中,该项目在某种级别上称为“公共”,以使我的Web项目和服务项目(业务逻辑层)都可以访问它。我使用的模型和ViewModels存储在服务中,因此我不能使用公共引用服务,因为服务已经引用了自定义IPagedList构造的公共,该自定义IPagedList构造用于定义将分页的对象列表。IPagedData包含一组用于筛选、排序和分页结果集的属性。已创建LINQ扩展(.ToPageList)以方便对数据执行这些操作。这个过程涉及到几个对象,但我至少会发布IPagedData(我希望这本词典放在哪里)

使用System.Collections.Generic;
命名空间GameKeyExchange.Common.Pagination
{
公共接口IPagedData
{
字典过滤器列表{get;set;}
/// 
///存储分页和排序信息。
/// 
PageSortCriteria条件{get;set;}
/// 
///超集内的子集总数。
/// 
int PageCount{get;}
/// 
///超集中包含的对象总数。
/// 
int TotalItemCount{get;}
/// 
///超集中此子集的从零开始的索引。
/// 
int PageIndex{get;}
/// 
///超集中此子集的一个基于索引的索引。
/// 
int页码{get;}
/// 
///任何单个子集的最大大小。
/// 
int PageSize{get;}
/// 
///如果这不是超集中的第一个子集,则返回true。
/// 
布尔上一页{get;}
/// 
///如果这不是超集中的最后一个子集,则返回true。
/// 
布尔有下一页{get;}
/// 
///如果这是超集中的第一个子集,则返回true。
/// 
bool是第一页{get;}
/// 
///如果这是超集中的最后一个子集,则返回true。
/// 
bool IsLastPage{get;}
}
}
理想情况下,我的服务中的代码实现如下所示:

var list = data.ClaimedKeys.Where(m => m.UserId == UserId).Select(m => new ClaimedKeysViewModel()
{
    KeyTypeId = m.GameKey.GameKeyGroup.KeyTypeId,
    PlatformId = m.GameKey.GameKeyGroup.PlatformId,

    Value = m.GameKey.Value,
    KeyType = m.GameKey.GameKeyGroup.KeyType.Name,
    Game = m.GameKey.GameKeyGroup.Game.Name,
    Platform = m.GameKey.GameKeyGroup.Platform.Name,
    Expiration = m.GameKey.GameKeyGroup.Expiration
})

list.FilterLists.Add("KeyTypeFilter", list.Select(m => new List<SelectListModel>()
{
    Value = m.KeyTypeId,
    Text = m.KeyType
});

list.FilterLists.Add("PlatformFilter", list.Select(m => new List<SelectListModel>()
{
    Value = m.PlatformId,
    Text = m.Platform
});

list.OrderBy(string.Format("{0} {1}", sort, order))
    .ToPagedList<ClaimedKeysViewModel>(pageNumber, pageSize);
var list=data.ClaimedKeys.Where(m=>m.UserId==UserId)。选择(m=>newclaimedkeysviewmodel()
{
KeyTypeId=m.GameKey.GameKeyGroup.KeyTypeId,
PlatformId=m.GameKey.GameKeyGroup.PlatformId,
Value=m.GameKey.Value,
KeyType=m.GameKey.GameKeyGroup.KeyType.Name,
Game=m.GameKey.GameKeyGroup.Game.Name,
Platform=m.GameKey.GameKeyGroup.Platform.Name,
Expiration=m.GameKey.GameKeyGroup.Expiration
})
list.FilterLists.Add(“KeyTypeFilter”,list.Select(m=>newlist())
{
值=m.KeyTypeId,
Text=m.KeyType
});
list.FilterLists.Add(“PlatformFilter”,list.Select(m=>newlist())
{
值=m.PlatformId,
Text=m.平台
});
list.OrderBy(string.Format(“{0}{1}”,排序,顺序))
.ToPagedList(页码、页面大小);
通过这种方式,我可以获取要在服务中分页的数据列表,构建我的分页,还可以包括发送回控制器的任意数量的筛选器列表。控制器接收到:IPageList,这是数据列表,包括这些用于排序和筛选的额外属性。它们随列表一起传递的原因是f数据是这样的,当通过单击页眉或更改页面进行重新排序时,您可以确切地知道您在哪个页面上,以及您的排序的当前状态

否则,我必须对数据库进行二次调用,以构建过滤器并将其作为ViewBag对象发送。此外,因为初始视图和刷新方法(在初始加载后用于重新调用或导航页面)我必须在两个方法中使用相同的代码来构建列表。如果我可以在生成列表的服务方法中使用相同的代码,那么只需要在那里完成;无论如何,在两个控制器方法中已经调用了相同的方法


希望这能更好地澄清用例。

除了使用
列表之外,它可能有助于使您的界面更通用:

public interface MyInterface<T>
{
  Dictionary<string, List<T>> FilterLists { get; set; }
}
公共接口MyInterface
{
字典过滤器列表{get;set;}
}

如果您在编译时不知道类型t,那么为什么首先需要泛型

如果您只想在不同的项目中重复使用它,请向您的界面添加一个通用约束:

public interface IFilters<T>
{
    Dictionary<string, List<T>> FilterLists { get; set; }
}
公共接口iFilter
{
字典过滤器列表{get;set;}
}
S
public interface IFilters<T>
{
    Dictionary<string, List<T>> FilterLists { get; set; }
}