最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中IEnumerable接口的使用

 更新時間:2025年12月01日 16:23:43   作者:Charles_go  
C#中的IEnumerable接口是.NET中表示可枚舉集合的核心接口,本文主要介紹了C#中IEnumerable接口的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在 C# 中,IEnumerable<T>(讀作 “I Enumerable”)是 .NET 中表示“可枚舉集合”的核心接口。它是 LINQ、foreach 循環(huán)以及幾乎所有集合類型(如 List<T>、數(shù)組、Dictionary<TKey, TValue> 等)的基礎(chǔ)。

?? 簡單說:只要一個對象實(shí)現(xiàn)了 IEnumerable<T>,你就能用 foreach 遍歷它,也能用 LINQ 查詢它。

? 核心作用

IEnumerable<T> 的唯一職責(zé)就是:提供一種方式,讓你能逐個訪問集合中的元素,而不需要知道集合內(nèi)部是怎么存儲數(shù)據(jù)的。

這體現(xiàn)了面向?qū)ο笾械?“抽象”“解耦” 思想。

?? 接口定義(簡化版)

public interface IEnumerable<out T>
{
    IEnumerator<T> GetEnumerator();
}
 
public interface IEnumerator<out T> : IDisposable
{
    T Current { get; }      // 當(dāng)前元素
    bool MoveNext();        // 移動到下一個元素,返回是否還有
    void Reset();           // 重置(很少用)
}

?? 你不需要手動實(shí)現(xiàn)這些(除非自定義集合),但要理解其工作原理。

? 最常見的使用場景

1.支持foreach循環(huán)

任何實(shí)現(xiàn) IEnumerable<T> 的類型都可以被 foreach 遍歷:

List<int> numbers = new List<int> { 1, 2, 3 };
 
// foreach 底層調(diào)用 numbers.GetEnumerator()
foreach (int n in numbers)
{
    Console.WriteLine(n);
}

2.作為方法返回類型(推薦?。?/h3>

當(dāng)你寫一個返回“一組數(shù)據(jù)”的方法時,優(yōu)先返回 IEnumerable<T> 而不是 List<T> 或數(shù)組:

public IEnumerable<string> GetActiveUsers()
{
    yield return "Alice";
    yield return "Bob";
    // 或 return dbContext.Users.Where(u => u.IsActive).Select(u => u.Name);
}

? 好處

  • 延遲執(zhí)行(Lazy Evaluation):調(diào)用方法時不會立即計(jì)算所有結(jié)果,而是在遍歷時逐個生成。
  • 解耦:調(diào)用方不關(guān)心你是用 List、數(shù)組還是數(shù)據(jù)庫查出來的。
  • 節(jié)省內(nèi)存:尤其適合大數(shù)據(jù)流或無限序列。

3.LINQ 查詢的基礎(chǔ)

所有 LINQ 方法(如 Where, Select, OrderBy)的輸入和輸出都是 IEnumerable<T>

var result = numbers
    .Where(x => x > 0)     // 返回 IEnumerable<int>
    .Select(x => x * 2);   // 返回 IEnumerable<int>

?IEnumerable<T>vsList<T>vs 數(shù)組

類型是否可修改是否知道長度是否支持索引延遲執(zhí)行適用場景
IEnumerable<T>? 只讀? 不一定(需遍歷才知道)? 不支持 list[0]? 是方法返回值、LINQ、通用遍歷
List<T>? 可增刪改? 有 .Count? 支持索引? 否(數(shù)據(jù)已存在)需要頻繁修改或隨機(jī)訪問
T[](數(shù)組)? 元素可改(但長度固定)? 有 .Length? 支持索引? 否性能敏感、大小固定的場景

?? 黃金建議:

  • 參數(shù)類型:如果只需要遍歷,用 IEnumerable<T>
  • 返回類型:優(yōu)先返回 IEnumerable<T>(除非調(diào)用方明確需要 List)
  • 局部變量:如果需要修改或索引,用 List<T>

? 自定義IEnumerable<T>示例(了解即可)

public class Countdown : IEnumerable<int>
{
    private int _start;
 
    public Countdown(int start) => _start = start;
 
    public IEnumerator<int> GetEnumerator()
    {
        for (int i = _start; i >= 0; i--)
            yield return i; // yield 自動實(shí)現(xiàn) IEnumerator
    }
 
    // 非泛型版本(為了兼容舊代碼)
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
 
// 使用
foreach (int n in new Countdown(3))
{
    Console.WriteLine(n); // 輸出: 3, 2, 1, 0
}

?? 實(shí)際開發(fā)中,99% 的情況你不需要手動實(shí)現(xiàn) IEnumerable<T>,因?yàn)?List<T>、數(shù)組等已經(jīng)實(shí)現(xiàn)了它。

?? 常見誤區(qū)

? 誤區(qū)1:IEnumerable<T>是一個集合類

? 正解:它只是一個接口,描述“可以被遍歷”,本身不存儲數(shù)據(jù)。

? 誤區(qū)2:多次遍歷IEnumerable<T>總是安全的

? 正解:有些 IEnumerable<T> 只能遍歷一次(比如從數(shù)據(jù)庫流式讀取的結(jié)果)。
如果需要多次遍歷,調(diào)用 .ToList() 緩存結(jié)果:

var query = dbContext.Users.Where(u => u.Age > 18); // IQueryable<T> : IEnumerable<T>
 
// 第一次遍歷:OK
foreach (var u in query) { ... }
 
// 第二次遍歷:可能報(bào)錯(數(shù)據(jù)庫連接已關(guān)閉)
foreach (var u in query) { ... } // ? 危險(xiǎn)!
 
// 安全做法:
var users = query.ToList(); // 立即執(zhí)行并緩存

? 小結(jié)

關(guān)鍵點(diǎn)說明
是什么表示“可被遍歷”的接口
核心方法GetEnumerator() → 返回一個“迭代器”
最大優(yōu)勢抽象遍歷邏輯,支持 foreach 和 LINQ
最佳實(shí)踐方法返回類型優(yōu)先用 IEnumerable<T>
注意陷阱警惕一次性枚舉器,必要時 .ToList()

?? 一句話記?。?br />“IEnumerable<T> = 能被 foreach 的東西。”

如果你正在寫一個返回列表的方法,不妨試試返回 IEnumerable<T>,你會發(fā)現(xiàn)代碼更靈活、更符合 .NET 設(shè)計(jì)哲學(xué) ??

需要我?guī)湍惴治瞿硞€具體場景該用 IEnumerable<T> 還是 List<T> 嗎?

問題

什么是枚舉器?

枚舉其是一種允許遍歷集合元素的機(jī)制,他是一種指向集合中當(dāng)前元素的指針。

假設(shè)一個方法返回某種類型的集合,如果你不希望用戶修改此集合,如何最好地表達(dá)你的意圖?

可以將其作為Ienumerable或其他只讀集合類型返回。

到此這篇關(guān)于C#中IEnumerable接口的使用的文章就介紹到這了,更多相關(guān)C# IEnumerable接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Winform中如何跨線程訪問UI元素

    Winform中如何跨線程訪問UI元素

    這篇文章主要介紹了Winform中如何跨線程訪問UI元素,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-10-10
  • C#中foreach語句使用break暫停遍歷的方法

    C#中foreach語句使用break暫停遍歷的方法

    這篇文章主要介紹了C#中foreach語句使用break暫停遍歷的方法,涉及C#中break語句跳出foreach循環(huán)的使用技巧,非常具有實(shí)用價值,是C#初學(xué)者必須掌握的重要技巧,需要的朋友可以參考下
    2015-04-04
  • C#結(jié)合JavaScript實(shí)現(xiàn)秒殺倒計(jì)時的方法

    C#結(jié)合JavaScript實(shí)現(xiàn)秒殺倒計(jì)時的方法

    這篇文章主要介紹了C#結(jié)合JavaScript實(shí)現(xiàn)秒殺倒計(jì)時的方法,涉及C#結(jié)合javascript操作時間的技巧,非常具有實(shí)用價值,需要的朋友可以參考下
    2015-04-04
  • C#中StringBuilder類的使用總結(jié)

    C#中StringBuilder類的使用總結(jié)

    本篇文章主要是對C#中StringBuilder類的使用方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • 如何利用Jenkins + TFS為.Net Core實(shí)現(xiàn)持續(xù)集成/部署詳解

    如何利用Jenkins + TFS為.Net Core實(shí)現(xiàn)持續(xù)集成/部署詳解

    這篇文章主要給大家介紹了關(guān)于如何利用Jenkins + TFS為.Net Core實(shí)現(xiàn)持續(xù)集成/部署的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • c#與mysql的連接

    c#與mysql的連接

    c#與mysql的連接...
    2007-03-03
  • C#使用linq給List某個屬性值賦值方式

    C#使用linq給List某個屬性值賦值方式

    在C#中使用LINQ進(jìn)行數(shù)據(jù)查詢與修改的最佳實(shí)踐,推薦使用ForEach方法或傳統(tǒng)的foreach循環(huán)進(jìn)行List對象屬性賦值;避免直接在LINQ查詢表達(dá)式中執(zhí)行賦值操作;可考慮使用Select投影生成新列表以保持?jǐn)?shù)據(jù)不變性
    2026-06-06
  • C#獲取計(jì)算機(jī)名,IP,MAC信息實(shí)現(xiàn)代碼

    C#獲取計(jì)算機(jī)名,IP,MAC信息實(shí)現(xiàn)代碼

    利用C#獲取計(jì)算機(jī)名,IP,MAC信息如何實(shí)現(xiàn),一直是網(wǎng)友們的頭疼問題,本文整理了一些實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2012-11-11
  • 使用C#正則表達(dá)式獲取必應(yīng)每日圖片地址

    使用C#正則表達(dá)式獲取必應(yīng)每日圖片地址

    這篇文章主要介紹了使用C#正則表達(dá)式獲取必應(yīng)每日圖片地址的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • c#之用戶定義的數(shù)據(jù)類型轉(zhuǎn)換介紹

    c#之用戶定義的數(shù)據(jù)類型轉(zhuǎn)換介紹

    c#允許定義自己的數(shù)據(jù)類型,這意味著需要某些工具支持在自己的數(shù)據(jù)類型間進(jìn)行數(shù)據(jù)轉(zhuǎn)換。方法是把數(shù)據(jù)類型轉(zhuǎn)換定義為相關(guān)類的一個成員運(yùn)算符,數(shù)據(jù)類型轉(zhuǎn)換必須聲明是隱式或者顯式,以說明怎么使用它
    2014-01-01

最新評論

安徽省| 长岛县| 赞皇县| 梅州市| 蚌埠市| 康乐县| 黑河市| 揭西县| 陆良县| 凤山市| 闻喜县| 南通市| 乌拉特前旗| 卫辉市| 龙州县| 封丘县| 兰州市| 富锦市| 巴彦县| 当阳市| 汉寿县| 宝丰县| 遂川县| 阜新市| 通江县| 南丰县| 历史| 从江县| 赤壁市| 定襄县| 达州市| 南陵县| 金昌市| 仙游县| 金塔县| 全南县| 沐川县| 岗巴县| 交城县| 威海市| 宁南县|