[英]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()
:
使用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.