c# - C#在lambda中过滤动态属性名称

标签 c# asp.net linq lambda

我遇到名称不正确的属性的麻烦:

public class Word
{
     public string Alt01 { get;set; }
     public string Alt02 { get;set; }
     public string Alt03 { get;set; }
     public string Alt04 { get;set; }
     public string Alt05 { get;set; }
}


这可能应该是List<string>类型的一个属性。但是其他人想出了这个主意,目前我无法更改结构。

我有一个返回很多Word对象的方法。我想做的是过滤出在一个或多个Word属性中具有匹配字符串的每个AltXX实例。

这是我到目前为止的内容:

foreach(var word in resultList) //<-- List<Word> 
{
    var alt01 = word.GetType().GetProperty("alt01").GetValue(word, null);
}


如果我稍微扩展一下,它将作为我的过滤器。但是我的问题是:使用lambda表达式可解决吗?

最佳答案

因此,我们将从一个简单的辅助方法(可能是扩展方法)开始,因为我们有很多属性而不是列表:

public static IEnumerable<string> getAlts(Word word)
{
    yield return word.Alt01;
    yield return word.Alt02;
    yield return word.Alt03;
    yield return word.Alt04;
    yield return word.Alt05;
}


如果可以具有N个属性而不是五个属性,则可以将其重构为使用反射。如果确实如此,那么上帝会帮助您。拍打让您处于该位置的开发人员,而不仅仅是对我使用一次List

这样,还算不错:

List<Word> words = new List<Word>();

string searchText = "foo";
var query = words.Where(word => getAlts(word).Any(alt => alt.Contains(searchText)));


我希望该单词的alt的Where Any包含搜索文本。它读起来就像它在工作一样。

关于c# - C#在lambda中过滤动态属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15303789/

相关文章:

C# 反序列化未知抽象类

c# - 来自代码块的结果变量赋值?

c# - 如果找到匹配项,则选择特定记录,否则选择 IGrouping<T> 中的第一条记录

c# - 如何转换项目并在 sitecore 中获取选定的项目?

c# - 用于检查 null 或空的 Linq Lambda 表达式

c# - 如何在树中找到重叠/冗余节点

c# - 为什么 Response.Redirect 不重定向外部 URL?

c# - javascript 和 c# 中的传递参数问题

c# - 为什么 HttpWebRequest.BeginGetResponse() 同步完成?

asp.net - 你如何获得asp :Menu to follow the url provided in the Web.站点地图?