[英]Check if data contains a value from List of string in LINQ
我是 LINQ 的新手。 我只是想問是否可以檢查一個字段是否包含字符串列表中的值。 假設我有一個如下定義的字符串列表。
List<String> yearList = new List<string>();
yearList.Add("2012");
yearList.Add("2015");
我也有一個班級Member
:
class Member
{
public string Name {get; set;}
public int Year {get; set;}
...
}
對象data
屬於實現IEnumerable<Member>
:
IEnumerable<Member> data = ...
因此 data 可以是List<Member>
或Member[]
,或任何其他表示 Member 對象的可枚舉序列的東西。
現在,如果year
字段在我的年份yearList
列表中,我想獲取數據。
或者更准確地說:
要求:給定一個實現IEnumerable<Member>
的對象數據,並給定一個實現IEnumerable<string>
的對象yearList
,其中字符串是年份的文本表示,給我對象data
中具有值的所有成員屬性Year
具有至少等於yearList
一個值的文本表示。
例如data
如下:
Name (string) | Year (int)
Ralph | 2012
Rafael | 2012
Bea | 2014
Lee | 2015
yearList
是字符串 {"2012", "2015"} 的序列。 我期待這樣的結果
Name (string) | Year (int)
Ralph | 2012
Rafael | 2012
Bea | 2014
Lee | 2015
我嘗試了以下,但沒有奏效
data.where(x => x.year.contains(yearList)); <--- THIS CODE NEEDS TO BE CHANGED
這在 LINQ 中可能嗎?
想想你會如何用循環來做到這一點
你可能會這樣做:
foreach(var d in data){
if(yearList.Contains(d.year))
...
}
但這和你寫的不一樣; 你寫的東西真的沒有意義:
//data.where(x => x.year.contains(yearList));
//as a loop
foreach(var d in data){
if(d.year.Contains(yearList))
...
}
“如果某一年包含一系列年份......”
因此,然后您正在使用諸如 LINQ Where 和 Select 之類的東西,將它們視為對事物列表進行操作的循環,並且您提供了一個接受單個參數的迷你方法,無論是集合中的什么,以及返回別的東西。 LINQ 將循環遍歷每個項目一次調用您的方法的集合,並傳入該項目。 您可以選擇該項目的名稱
這就是為什么在迷你方法 (lambda) 中使用復數名稱和單數名稱作為參數會有所幫助的原因。
var cars = //list of cars
cars.Where(car => car.Maker == "Ford");
避免使用像x
這樣平淡無奇的名字,因為它*不能幫助你在頭腦中保持清醒,知道事情是什么。 看看這個:
var cars = //list of cars
var seekingMakers = new []{"Ford", GM"};
cars.Where(car => seekingMakers.Any(seekingMaker => car.Maker == seekingMaker));
我們命名了外部( car
)和內部( seekingMaker
)以幫助將它們分開並提醒我們它們是什么。 seekingMaker
是字符串數組seekingMakers
的單個字符串。
所以,對於你的Where
你必須從你的 lambda 返回一個布爾值,它用於確定列表中的項目是否進入輸出
var winners = //your list of people/year
winners.Where(winner => yearList.Contains(winner.Year));
你不能說winner.Year.Contains(yearList)
——你可以說winner.Year.IsContainedWithin(yearList)
——但是沒有IsContainedWithin
這樣的東西——它是相反的: collection.Contains(singular)
——不是“singular”包含集合"
現在,您從未說過您的人員列表中的數據類型“Year”是什么 - 也許它是一個字符串,在這種情況下,為什么您將yearList
作為字符串是yearList
的..但如果它不是字符串,那么我強烈建議你避免讓它成為不同的數據類型,因為就地轉換它會使你的 LINQ 語句變得混亂,也會降低性能,因為 C# 將花費大量時間一遍又一遍地轉換值
在任何時候您想針對某個固定值運行搜索時,請將該值的數據類型與正在搜索的數據的數據類型相匹配:
做這個:
var winners = //your list of people/year with INTEGER years
var years = new[]{ 2012, 2015 };
winners.Where(winner => yearList.Contains(winner.Year));
不是這些:
var winners = //your list of people/year with INTEGER years
var years = new[]{ "2012", "2015" };
//don't convert the winner's Year
winners.Where(winner => yearList.Contains(winner.Year.ToString()));
//really don't parse the string years to ints over and over
winners.Where(winner => yearList.Select(stringYear => int.Parse(stringYear)).Contains(winner.Year));
如果您的數據以字符串形式發送給您,請將其轉換一次:
var winners = //your list of people/year with INTEGER years
//pass every item to int.Parse and capture the result to an array you can reuse
var years = stringYearsFromElsewhere.Select(int.Parse).ToArray();
winners.Where(winner => yearList.Contains(winner.Year));
特別是在使用 LINQ 時,努力尋找方法讓代碼讀起來像一本書。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.