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
C# 如何从列表中选择动态列_C#_Linq - Fatal编程技术网

C# 如何从列表中选择动态列

C# 如何从列表中选择动态列,c#,linq,C#,Linq,我想从列表中动态选择列,如下所示。那么最好的办法是什么呢 //a objects list List<DashBoard> dashboardlist = (List<DashBoard>)objList; string strColumns = "RecDate,ModifiedDate"; objList = (from obj in dashboardlist select new { strColumns }).ToList(); /////////////

我想从列表中动态选择列,如下所示。那么最好的办法是什么呢

//a objects list
List<DashBoard> dashboardlist = (List<DashBoard>)objList;  
string strColumns = "RecDate,ModifiedDate";
objList = (from obj in dashboardlist select new { strColumns }).ToList();
/////////////
好的,忘了对象列表吧,比如说我有一个数据库表,表中有列ID、名称、年龄、性别等。然后我有列列表要显示,列列表会根据条件而改变。所以我列出了一些人;和列表列模板;现在我想根据模板选择列

我假设列列表可能来自外部资源,并且会发生变化,我建议:

通过反射,您可以生成对应于每个列的FieldInfo列表,然后循环列表中的每个项目和每个FieldInfo,并调用数据对象上的GetValue。

以下是解决方案:
看看动态Linq:

假设您只有两个模板。可以为每个模板创建一个方法,该方法只返回所需的列。大概是这样的:

// method for template 1 - returns only 3 columns/properties
private DashBoard CreateDashBoardXxxxxxx(DashBoard item)
{
    return new DashBoard {
        Property1 = item.Property1,
        Property4 = item.Property2,
        Property3 = item.Property3
    };
}

// method for template 2 - returns N columns/properties
private DashBoard CreateDashBoardYyyyyyyy(DashBoard item)
{
    return new DashBoard {
        Property1 = item.Property1,
        Property4 = item.Property2,

        // Other properties
        // .....

        PropertyN = item.PropertyN
    };
}
List<DashBoard> dashboardlist = (List<DashBoard>)objList; 

// using template 1
var list = dashboardlist.Select(CreateDashBoardXxxxxxx);

// using template 2
var list2 = dashboardlist.Select(CreateDashBoardYyyyyyyy);
然后,您可以使用以下方法:

// method for template 1 - returns only 3 columns/properties
private DashBoard CreateDashBoardXxxxxxx(DashBoard item)
{
    return new DashBoard {
        Property1 = item.Property1,
        Property4 = item.Property2,
        Property3 = item.Property3
    };
}

// method for template 2 - returns N columns/properties
private DashBoard CreateDashBoardYyyyyyyy(DashBoard item)
{
    return new DashBoard {
        Property1 = item.Property1,
        Property4 = item.Property2,

        // Other properties
        // .....

        PropertyN = item.PropertyN
    };
}
List<DashBoard> dashboardlist = (List<DashBoard>)objList; 

// using template 1
var list = dashboardlist.Select(CreateDashBoardXxxxxxx);

// using template 2
var list2 = dashboardlist.Select(CreateDashBoardYyyyyyyy);
您只需要编写一些代码来决定应该使用哪个模板


我希望这有帮助

谢谢你为我的问题提供了一些想法。花了几个小时 我找到了谷歌


您计划如何使用objList?我希望您认识到,访问属性不会像静态定义列select new{obj.RecDate,obj.ModifiedDate}时那样简单,因为您选择的列是new{obj.RecDate,obj.ModifiedDate},因此C可以为您创建匿名类型。只需继续使用完整的DashBoard对象并根据需要仅读取字符串指定的属性可能会更容易?我倾向于同意Tim S-坚持使用Dashboard对象有什么理由需要返回匿名对象,或者需要返回一个初始化了不同属性的列表吗?好吧,忘了对象列表吧,我说我有一个数据库表,它有列ID、名称、年龄、性别、,等等,然后我有一个列列表要显示,列列表会根据条件而改变。所以我列出了一些人;并列出LTE列;现在我想根据模板选择列。