簡體   English   中英

C#Linq,在兩個列表中搜索相同的項目

[英]C# Linq, Searching for same items in two lists

我們有以下設置:我們有一個帶有字符串的對象數組(xml-ish但未規范化),我們有一個帶id的字符串列表/數組。

我們需要找出其中一個對象中是否還存在來自該列表的帶有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

對於您的情況,您可以像這樣編寫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總是返回0 ,而x.Contains(y) || y.Contains(x) x.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)));
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i)))

暫無
暫無

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

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