Joh*_*han 1 c# linq asp.net 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; }
}
Run Code Online (Sandbox Code Playgroud)
这应该是该类型的一个属性List<string>.但其他人想出了这个想法,我现在无法改变结构.
我有一个返回很多Word对象的方法.我想要做的是过滤掉Word一个或多个AltXX属性中具有匹配字符串的每个实例.
这是我到目前为止:
foreach(var word in resultList) //<-- List<Word>
{
var alt01 = word.GetType().GetProperty("alt01").GetValue(word, null);
}
Run Code Online (Sandbox Code Playgroud)
如果我稍微扩展它,这将作为我的过滤器.但我的问题是:这是否可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
如果它可以有N个属性而不是五个属性,你可以重构它以使用反射.如果你真的如此,上帝会帮助你.抨击那个把你放在那个位置的开发人员,而不是仅仅List为我使用一次.
有了它,它并不太糟糕:
List<Word> words = new List<Word>();
string searchText = "foo";
var query = words.Where(word => getAlts(word).Any(alt => alt.Contains(searchText)));
Run Code Online (Sandbox Code Playgroud)
我希望该单词Where Any的alt的单词包含搜索文本.它读起来就像它的工作原理.