簡體   English   中英

從列表中選擇<T>

[英]Select from a List<T>

我確定有一種很好的方法可以做到這一點(我猜測其中一種擴展方法?),但我很難在Google上找到它。

基本上我有一個自定義類列表; 我想從中選擇一些項目到一個新的List中,其中一個屬性等於另一個List中的任何值。

這是我正在嘗試做的一個(簡化)快速示例:

public class Job
    {
        public int Number;
        public string ClientCompanyName;            
    }

List<Job> lstJobs = new List<Job>();
List<Job> lstCompare = new List<Job>();

通常我會這樣做:

List<Job> lstFiltered = new List<Job>();
foreach(Job jobThis in lstCompare)
{
    foreach(jobComp in lstCompare)
    {
        if(jobThis.Number = jobComp.Number)
        {
            lstFiltered.Add(jobThis);
        }
    }
}

是否有一種擴展方法可以將最后一位加入(理想情況下)單行?

干杯

使用Intersect
要使它與您的自定義比較一起使用,您需要在類中實現IEquatable<T> ,或者為您的類創建一個實現IEqualityComparer<T>的新類,並將其傳遞給Intersect的重載。

傑斯,

您可以使用LINQ intersect函數,或嘗試:

var matches = from jobs in lstJobs
               join comp in lstCompare on jobs.Number equals comp.Number
               select jobs;

或LINQ語法:

var matches = lstJobs.Join(lstCompare, jobs => jobs.Number,
                           comp => comp.Number, (jobs, comp) => jobs);

這里是基於原始循環的reSharper版本:

List<Job> lstFiltered = (lstJobs.SelectMany(jobThis => lstCompare, 
                        (jobThis, jobComp) => new {jobThis, jobComp})
                        .Where(@t => @t.jobThis.Number == @t.jobComp.Number)
                        .Select(@t => @t.jobThis)).ToList();

稍微冗長,但另一種方式皮膚貓。

[編輯]已設置為新列表,而不是選定的元素 - doh

var lstFiltered = lstJobs
        .Where(job => lstCompare.Any(item => item.Number == job.Number))
        .ToList();

如果lstCompare的項目數量lstCompare則上述解決方案很有效。 對於更大的比較列表,您可能希望使用一些基於散列的集合。

var compareSet = new HashSet<int>(lstCompare.Select(item => item.Number));
var lstFiltered = lstJobs
        .Where(job => compareSet.Contains(job.Number))
        .ToList();

如果比較條件更復雜或者在多個地方需要它,則應創建一個實現IEqualityComparer<T>的比較器類。 然后你可以像其他人已經建議的那樣使用Intersect()方法。 但是,它在功能上與上述解決方案不同。 當我的解決方案返回所有匹配元素時,它只返回不同的元素 在某些應用中,這可能是一個顯着的差異。

如果需要,可以輕松更改我的第二個示例以使用IEqualityComparer<T> HashSet<T>將比較器作為第二個參數。

暫無
暫無

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

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