2012-08-27 89 views
5

我們有以下設置: 我們有一個包含字符串的對象數組(xml-ish,但沒有標準化),並且我們有一個帶有id的字符串列表/數組。C#Linq,在兩個列表中搜索相同的項目

我們需要確定一個字符串是否來自該列表中帶有id的字符串。

在這裏,我們有我們已經嘗試了設置:

public class Wrapper 
{ 
    public string MyProperty { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Wrapper> wrappers = new List<Wrapper>() 
     { 
      new Wrapper{ MyProperty = "<flkds,dlsklkdlsqkdkqslkdlqk><id>3</id><sqjldkjlfdskjlkfjsdklfj>"}, 
      new Wrapper{ MyProperty = "<flkds,dlsklkdlsqkdkqslkdlqk><id>2</id><sqjldkjlfdskjlkfjsdklfj>"} 
     }; 
     string[] ids = { "<id>0</id>", "<id>1</id>", "<id>2</id>" }; 

     var props = wrappers.Select(w => w.MyProperty); 
     var intersect = props.Intersect(ids, new MyEquilityTester()); 
     Debugger.Break(); 
    } 
} 

class MyEquilityTester: IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Contains(y); 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 

編輯:

我們期待什麼,當我們做一個.Any()intersect即是說true因爲包裝與道具一個對象其中包含<id>2</id>,intersectnull

如果我們使用錯誤的方法,請說。它應該儘可能快地工作。一個簡單的true當發現將做!

+1

什麼是你的問題嗎? –

+0

@DanielHilgarth我已更新信息 – Frederiek

+0

這裏要做的最好的事情是將'MyProperty'中的文本解析爲更具可讀性/易於LINQ /可維護的結構。 – devundef

回答

6

對於你的情況,你可以寫你的IEqualitycomparer這樣的:

class MyEquilityTester: IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Contains(y) || y.Contains(x); 
    } 

    public int GetHashCode(string obj) 
    { 
     return 0; 
    } 
} 

,它會發現

<flkds,dlsklkdlsqkdkqslkdlqk><id>2</id><sqjldkjlfdskjlkfjsdklfj> 

這工作,因爲GetHashCode總是返回0x.Contains(y) || y.Contains(x)檢查。


另一個不那麼哈克的解決方案是結合使用WhereAny

IEnumerable<String> intersect = props.Where(p => ids.Any (i => p.Contains(i))); 

或更換Where另一個Any,如果你不關心實際的項目,你只想要一個truefalse

bool intersect = props.Any(p => ids.Any (i => p.Contains(i))); 
+0

Thx很多人,它的作品! – Frederiek

1
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i)))