簡體   English   中英

C#在lambda中過濾動態屬性名稱

[英]c# filtering dynamic property names in 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對象的方法。 我想做的是過濾掉一個或多個AltXX屬性中具有匹配字符串的每個Word實例。

這是我到目前為止的內容:

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)));

我想要單詞“ Where Any一個alt都包含搜索文本”。 它讀起來就像它在工作一樣。

您可以通過創建助手類以向后兼容的方式將類轉換為List<string>

例如

class QueryFriendlyWordList
{
    public List<string> Words;

    public QueryFriendlyWordList(Word words)
    {
            Words = new List<string> {words.P1,words.P2, words.P3, words.P4};
    }
}

用法

        Word words = new Word {P1 = "abcd", P2 = "abc", P3 = "def", P4 = "qwre"};
        var queryable = new QueryFriendlyWordList(words);
        var result = queryable.Words.Where(w => w.Contains("a"));

靜態甚至更容易:

static class WordConverter
{       
    public static List<string> Convert(Word words)
    {
            return new List<string> {words.P1,words.P2, words.P3, words.P4};
    }
}

最好的辦法是在應用程序啟動時使用反射一次來構建表達式樹,將其編譯為lambda,然后保存這些lambda以供重新使用。

反射緩慢的代價僅需支付一次,然后此價格就如同您從一開始就對其進行編譯一樣快。

但是,編寫這些表達式樹很麻煩,因此,如果您不關心性能(速度很慢,但不那么慢),那么您的反射應該很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM