使用Linq动态选择要获取的属性
我有一个MVC应用程序,其中一个页面上有一个动态表,用户可以定义表的列数、列顺序以及从何处获取每个字段的数据 为了保持动态性,我写了一些非常糟糕的代码,现在我希望它更高效 我的问题是,我不知道如何定义在运行时应该返回到IEnumerable中的列。我的主要问题是我不知道我可能有多少专栏 我有一个类的引用,该类获取字段的文本。我还拥有一个字典,其中包含每个字段的顺序,以及它应该从中获取数据的确切属性 我的代码应该是这样的:使用Linq动态选择要获取的属性,linq,dynamic-programming,Linq,Dynamic Programming,我有一个MVC应用程序,其中一个页面上有一个动态表,用户可以定义表的列数、列顺序以及从何处获取每个字段的数据 为了保持动态性,我写了一些非常糟糕的代码,现在我希望它更高效 我的问题是,我不知道如何定义在运行时应该返回到IEnumerable中的列。我的主要问题是我不知道我可能有多少专栏 我有一个类的引用,该类获取字段的文本。我还拥有一个字典,其中包含每个字段的顺序,以及它应该从中获取数据的确切属性 我的代码应该是这样的: var docsRes3 = from d in docs
var docsRes3 = from d in docs
select new[]
{
for (int i=0; i<numOfCols; i++)
{
gen.getFieldText(d, res.FieldSourceDic[i]);
}
};
var docsRes3=来自文档中的d
选择新[]
{
对于(int i=0;i请尝试以下操作:
var docsRes3 = from d in docs
select (
from k in res.FieldSourceDic.Keys.Take(numOfCols)
select gen.getFieldText(d, res.FieldSourceDic[k]));
我通过以下链接获得了答案:
首先,我创建了一个包含所有属性的字符串数组:
//Creats a string of all properties as defined in the XML
//Columns order must be started at 0. No skips are allowed
StringBuilder fieldsSB = new StringBuilder();
for (int i = 0; i < numOfCols; i++)
{
string field = res.FieldSourceDic[i];
if (!string.IsNullOrEmpty(fieldsSB.ToString()))
{
fieldsSB.Append(",");
}
fieldsSB.Append(field);
}
var cols = fieldsSB.ToString().Split(',');
//Gets the data for each row dynamically
var docsRes = docs.Select(d => GetProps(d, cols));
//创建XML中定义的所有属性的字符串
//列顺序必须从0开始。不允许跳过
StringBuilder fieldsSB=新的StringBuilder();
for(int i=0;iGetProps(d,cols));
然后我创建了GetProps函数,它使用问题中描述的我自己的函数:
private static dynamic GetProps(object d, IEnumerable<string> props)
{
if (d == null)
{
return null;
}
DynamicGridGenerator gen = new DynamicGridGenerator();
List<string> res = new List<string>();
foreach (var p in props)
{
res.Add(gen.getFieldText(d, p));
}
return res;
}
私有静态动态GetProps(对象d,IEnumerable props)
{
如果(d==null)
{
返回null;
}
DynamicGridGenerator=新的DynamicGridGenerator();
List res=新列表();
foreach(道具中的var p)
{
res.Add(gen.getFieldText(d,p));
}
返回res;
}
//Creats a string of all properties as defined in the XML
//Columns order must be started at 0. No skips are allowed
StringBuilder fieldsSB = new StringBuilder();
for (int i = 0; i < numOfCols; i++)
{
string field = res.FieldSourceDic[i];
if (!string.IsNullOrEmpty(fieldsSB.ToString()))
{
fieldsSB.Append(",");
}
fieldsSB.Append(field);
}
var cols = fieldsSB.ToString().Split(',');
//Gets the data for each row dynamically
var docsRes = docs.Select(d => GetProps(d, cols));
private static dynamic GetProps(object d, IEnumerable<string> props)
{
if (d == null)
{
return null;
}
DynamicGridGenerator gen = new DynamicGridGenerator();
List<string> res = new List<string>();
foreach (var p in props)
{
res.Add(gen.getFieldText(d, p));
}
return res;
}