2012-08-27 135 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)))