首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LINQ Select()或ForEach循环

LINQ Select()或ForEach循环
EN

Stack Overflow用户
提问于 2012-12-19 12:05:35
回答 2查看 11.1K关注 0票数 2

我是第一次接触泛型,但我知道我需要使用它们来帮助保持事物的完整性:)

我正在尝试创建一个类,将许多不同类型的列表转换为一个通用类,该类由dropdownlist控件使用,但无法使其工作。我在下面的方法中展示了两个尝试的选项,试图让每个选项都能工作(一个foreach循环和一个linq),但都没有用。

代码语言:javascript
复制
private static IEnumerable<ddlOptions> GetDDLOptionsViewModel<T>(List<T> genericList, string strPropName)
{
    // option A: ForEach loop
    Type type = genericList.GetType();
    var IdProperty = type.GetProperty("Id");
    var DisplayNameProp = type.GetProperty(strPropName);

    List<ddlOptions> options = new List<ddlOptions>();
    foreach (var l in genericList)
    {
        options.Add(new ddlOptions
            { 
                Id = IdProperty.GetValue(l, null), 
                DisplayName = DisplayNameProp.GetValue(l, null)
            });
    }
    return options;

    // option B - LINQ
    return from l in genericList
           select new ddlOptions
           {
               Id = l.Id,
               DisplayName = l.strPropName
           };
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-19 12:27:04

您可以使用接口来约束T以包含Id属性,并且可以使用Func<T,string>来访问T类型对象的任何给定属性,同时保持类型安全并避免反射:

代码语言:javascript
复制
public interface IId
{
  string Id {get;}
}


private static IEnumerable<ddlOptions> GetDDLOptionsViewModel<T>
    (IEnumerable<T> list, Func<T,string> propAccess)
   where T:IId
{
   return list.Select(l => new DdlOption
    {
        Id = l.Id,
        DisplayName = propAccess(l)
    });
}
票数 5
EN

Stack Overflow用户

发布于 2012-12-19 12:09:07

甚至更短(也是LINQ),一行和一个扩展方法:

代码语言:javascript
复制
public static IEnumerable<DdlOption> ToDdlOption<T>(this IEnumerable<T> genericList, string strPropName)
{
    return genericList.Select(l => new DdlOption
        {
            Id = l.Id,
            DisplayName = l.strPropName
        });
}

另外,我会用大写字母命名一个类,并避免复数形式。

并且不要忘记通过调用ToArray()ToList()来物化任何LINQ查询结果。

要将属性名称转换为以lambda表达式为目标的属性:

代码语言:javascript
复制
public static Func<T, object> ToLambda<T>(this string propertyName)
{
    ParameterExpression param = Expression.Parameter(typeof(T), "x"); // x
    Expression property = Expression.Property(param, propertyName);   // x.PropertyName
    Func<T, object> lambda = Expression.Lambda<Func<T, object>>(      // x => x.PropertyName
            Expression.Convert(property, typeof(object)),
            param)
        .Compile();
    return lambda;
}

用法:

代码语言:javascript
复制
// assuming class X { public string PropertyName { get; set; }
var lambda = "PropertyName".ToLambda<X>()
var x = new X { PropertyName = "Hi!" };
string value = lambda(x); // "Hi!"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13945317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档