簡體   English   中英

檢查數據是否包含來自 LINQ 字符串列表的值

[英]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.

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