Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Linq动态选择要获取的属性_Linq_Dynamic Programming - Fatal编程技术网

使用Linq动态选择要获取的属性

使用Linq动态选择要获取的属性,linq,dynamic-programming,Linq,Dynamic Programming,我有一个MVC应用程序,其中一个页面上有一个动态表,用户可以定义表的列数、列顺序以及从何处获取每个字段的数据 为了保持动态性,我写了一些非常糟糕的代码,现在我希望它更高效 我的问题是,我不知道如何定义在运行时应该返回到IEnumerable中的列。我的主要问题是我不知道我可能有多少专栏 我有一个类的引用,该类获取字段的文本。我还拥有一个字典,其中包含每个字段的顺序,以及它应该从中获取数据的确切属性 我的代码应该是这样的: var docsRes3 = from d in docs

我有一个MVC应用程序,其中一个页面上有一个动态表,用户可以定义表的列数、列顺序以及从何处获取每个字段的数据

为了保持动态性,我写了一些非常糟糕的代码,现在我希望它更高效

我的问题是,我不知道如何定义在运行时应该返回到IEnumerable中的列。我的主要问题是我不知道我可能有多少专栏

我有一个类的引用,该类获取字段的文本。我还拥有一个字典,其中包含每个字段的顺序,以及它应该从中获取数据的确切属性

我的代码应该是这样的:

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;
    }