请问能动态创建List(of t) select() expression表达式

mjzxlmg 2020-03-03 08:33:52
请问能动态创建List(of t) select() expression表达式
即:dim result = list(of t).select(function(p) {p.name,p.age,p.sex}).tolist
红色字体的能使用变量吗?function(p) p.name是可以使用的,但不会使用数组的
...全文
634 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjzxlmg 2022-12-22
  • 打赏
  • 举报
回复

https://www.cnblogs.com/itheo/p/14358495.html#3%E6%9E%84%E5%BB%BA%E8%A1%A8%E8%BE%BE%E5%BC%8F
《通过创建动态类型 动态构建Expression Select表达式来控制Property可见性》这个文章略为修改完美解决了我的问题。

mjzxlmg 2020-04-09
  • 打赏
  • 举报
回复
引用 12 楼 raynors 的回复:
[quote=引用 10 楼 正怒月神 的回复:]


只是用了简单的包装,吧 expression表达式 作为了一个变量,换了个地方引用.

楼主应该是要动态组装expression表达式,就是不能写死在程序里.

var q = Test(x => new User{ID=x.ID,Name = x.Name });

楼主应该要表达的意思是这样的吧:

var q = Test("ID,Name");

[/quote]

你说得太对了。
我就是这个意思。
类似DATATABLE中的选择其中几列构成新的DATATABLE
newdt=dt.DefaultView.ToTable(False, {"column1","column2","column3"})
raynors 2020-04-08
  • 打赏
  • 举报
回复
引用 10 楼 正怒月神 的回复:
只是用了简单的包装,吧 expression表达式 作为了一个变量,换了个地方引用. 楼主应该是要动态组装expression表达式,就是不能写死在程序里. var q = Test(x => new User{ID=x.ID,Name = x.Name }); 楼主应该要表达的意思是这样的吧: var q = Test("ID,Name");
raynors 2020-04-08
  • 打赏
  • 举报
回复
简单地翻译了一下版主大人的代码,但是我觉得完全没有GET到楼主的意思.

    Public Class student
        Public name As String
        Public sex As String
        Public age As Integer
    End Class

    Public 二年一班 As New List(Of student)

    Public Function 学生选择器(表达式 As Func(Of student, student)) As IEnumerable(Of student)
        Return 二年一班.Select(表达式)
    End Function

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim p1 = New student With {.name = "张三", .age = 8, .sex = "男"}
        Dim p2 = New student With {.name = "李四", .age = 9, .sex = "女"}
        Dim p3 = New student With {.name = "王五", .age = 8, .sex = "男"}
        Dim p4 = New student With {.name = "赵六", .age = 7, .sex = "女"}

        二年一班.Add(p1)
        二年一班.Add(p2)
        二年一班.Add(p3)
        二年一班.Add(p4)
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim selected = 学生选择器(Function(s)
                                 Return New student With {.name = s.name, .sex = s.sex}
                             End Function).ToList
    End Sub

正怒月神 2020-03-09
  • 打赏
  • 举报
回复
引用 9 楼 mjzxlmg 的回复:
你最上面的代码能看懂,其它问题的关键在于如何动态构建selector表达式。 我贴出的代码参考的是C#代码:http://www.tnblog.net/aojiancc2/article/details/2346 是可以动态生成SELECTOR表达式的。但是需要一个实体类TResult。那么问题来了,如何我在代码已经创建了实体类TResult我又何必动态创建呢,直接new 一个就行。我想要的是原来的实体类中几个字段,不要TResult。 你在https://bbs.csdn.net/topics/392403424这个帖子中回复也是缺少完整的事例,本人愚钝理解不了,能否以C#代码写一个简单事例出来。谢谢你。
        public static void Main(string[] args)
        {
            var q = Test(x => new User{ID=x.ID,Name = x.Name });

            Console.ReadLine();
        }

        public static IEnumerable<User> Test(Func<User, User> selector)
        {
            return myList.Select(selector);
        }

        public class User 
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
            public bool? IsChild { get; set; }

        }
mjzxlmg 2020-03-08
  • 打赏
  • 举报
回复
引用 8 楼 正怒月神 的回复:
[quote=引用 6 楼 mjzxlmg 的回复:]

你要不就等有缘人,帮你翻译一下我上面的C#代码吧。
我不太会vb.net。对着写太吃力。[/quote]

你最上面的代码能看懂,其它问题的关键在于如何动态构建selector表达式。
我贴出的代码参考的是C#代码:http://www.tnblog.net/aojiancc2/article/details/2346
是可以动态生成SELECTOR表达式的。但是需要一个实体类TResult。那么问题来了,如何我在代码已经创建了实体类TResult我又何必动态创建呢,直接new 一个就行。我想要的是原来的实体类中几个字段,不要TResult。
你在https://bbs.csdn.net/topics/392403424这个帖子中回复也是缺少完整的事例,本人愚钝理解不了,能否以C#代码写一个简单事例出来。谢谢你。
正怒月神 2020-03-05
  • 打赏
  • 举报
回复
引用 6 楼 mjzxlmg 的回复:
你要不就等有缘人,帮你翻译一下我上面的C#代码吧。 我不太会vb.net。对着写太吃力。
mjzxlmg 2020-03-05
  • 打赏
  • 举报
回复
http://www.chinaoc.com.cn/p/1303571.html
mjzxlmg 2020-03-05
  • 打赏
  • 举报
回复
引用 5 楼 正怒月神 的回复:
[quote=引用 4 楼 mjzxlmg 的回复:]
[quote=引用 3 楼 正怒月神 的回复:]
如果很多地方都要用,那可以把Test改成泛型

谢谢你的回复,初学看不太明白。
请问这个selector 要怎样才能得到呢?
我最终的目的是想从一个很多字段的类中根据需要提取其中的几列数据在Datatable中显示出来
[/quote]
这个selector九十你的function(p)
但是需要一个委托来封装。
具体的vb.net语法我不清楚。但是肯定有。[/quote]

能否用C#写个例子出来,我可以转换成VB.NET语法的
网上找到的:但是出来的所有字段,不是我想要几个字段
Public Function CreateSelecter(Of TSource, TResult)(ByVal fieldNames() As String) As Expression(Of Func(Of TSource, TResult))
Dim param As ParameterExpression = Expression.Parameter(GetType(TSource), "p")
Dim NewTReslut = Expression.[New](GetType(TResult))
Dim bindingList As New List(Of MemberBinding)
For Each fieldName As String In fieldNames
Dim Propertyinfo As PropertyInfo = GetType(TSource).GetProperty(fieldName)
Dim Expr As MemberExpression = Expression.PropertyOrField(param, fieldName)
Dim m As MemberAssignment = Expression.Bind(Propertyinfo, Expr)
bindingList.Add(m)
Next
Dim MemberInit As MemberInitExpression = Expression.MemberInit(NewTReslut, bindingList)
Dim selector As Expression(Of Func(Of TSource, TResult)) = CType(Expression.Lambda(MemberInit, param), Expression(Of Func(Of TSource, TResult)))
Return selector
End Function
正怒月神 2020-03-05
  • 打赏
  • 举报
回复
引用 4 楼 mjzxlmg 的回复:
[quote=引用 3 楼 正怒月神 的回复:] 如果很多地方都要用,那可以把Test改成泛型
谢谢你的回复,初学看不太明白。 请问这个selector 要怎样才能得到呢? 我最终的目的是想从一个很多字段的类中根据需要提取其中的几列数据在Datatable中显示出来 [/quote] 这个selector九十你的function(p) 但是需要一个委托来封装。 具体的vb.net语法我不清楚。但是肯定有。
mjzxlmg 2020-03-05
  • 打赏
  • 举报
回复
引用 3 楼 正怒月神 的回复:
如果很多地方都要用,那可以把Test改成泛型

谢谢你的回复,初学看不太明白。
请问这个selector 要怎样才能得到呢?
我最终的目的是想从一个很多字段的类中根据需要提取其中的几列数据在Datatable中显示出来
正怒月神 2020-03-05
  • 打赏
  • 举报
回复
如果很多地方都要用,那可以把Test改成泛型
正怒月神 2020-03-05
  • 打赏
  • 举报
回复
可以的。虽然我没玩过vb.net 但是东西基本是一致的。 我用C#代码,展示一下。 重点还是对于 Func委托的运用。
jhonsonzhang 2020-03-05
  • 打赏
  • 举报
回复
需要使用反射

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧