Tek bir öğeyi IEnumerable <T> olarak iletme


377

Tek bir öğe türünü parametre Tbekleyen bir yönteme geçirmenin yaygın bir yolu var mı IEnumerable<T>? Dil C #, çerçeve sürümü 2.0.

Şu anda bir yardımcı yöntem kullanıyorum (bu. Net 2.0, bu yüzden döküm / projelendirme yardımcı yöntemleri LINQ benzer bir sürü var), ama bu sadece aptalca görünüyor:

public static class IEnumerableExt
{
    // usage: IEnumerableExt.FromSingleItem(someObject);
    public static IEnumerable<T> FromSingleItem<T>(T item)
    {
        yield return item; 
    }
}

Başka bir yol elbette bir List<T>veya bir oluşturmak ve doldurmak Arrayve yerine geçmek olacaktır IEnumerable<T>.

[Düzenle] Bir uzantı yöntemi olarak adlandırılabilir:

public static class IEnumerableExt
{
    // usage: someObject.SingleItemAsEnumerable();
    public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
    {
        yield return item; 
    }
}

Burada bir şey mi eksik?

[Edit2] We found someObject.Yield()(@Peter aşağıdaki yorum önerdiği gibi) işte o kimse yakala istiyorsa XML açıklama ile birlikte olduğunu, ağırlıklı olarak kısalık için, bu uzantı yöntemi için en iyi isim olarak:

public static class IEnumerableExt
{
    /// <summary>
    /// Wraps this object instance into an IEnumerable&lt;T&gt;
    /// consisting of a single item.
    /// </summary>
    /// <typeparam name="T"> Type of the object. </typeparam>
    /// <param name="item"> The instance that will be wrapped. </param>
    /// <returns> An IEnumerable&lt;T&gt; consisting of a single item. </returns>
    public static IEnumerable<T> Yield<T>(this T item)
    {
        yield return item;
    }
}

6
Uzatma yönteminin gövdesinde küçük bir değişiklik yapardım: if (item == null) yield break; Şimdi null'u geçmenin yanı sıra (önemsiz) null nesne deseninden yararlanmıyorsunuz IEnumerable. ( foreach (var x in xs)boş bir xspara cezası ile ilgilenir). Bu arada, bu işlev liste monad için monadik birimdir IEnumerable<T>ve Microsoft'ta monad aşk şenliği göz önüne alındığında, bunun gibi bir şey ilk başta çerçeve içinde değil şaşırdım.
Matt Enright

2
Uzantı yöntemi için, bunu adlandırmamalısınız, AsEnumerableçünkü bu ada sahip yerleşik bir uzantı zaten vardır . (Ne zaman Tuygular IEnumerable, örneğin string.)
Jon-Eric

22
Yöntemi adlandırmaya ne dersiniz Yield? Hiçbir şey kısalığı yenemez.
Philip Guin

4
Burada önerileri adlandırma. "SingleItemAsEnumerable" biraz ayrıntılı. "Getiri", arayüz yerine uygulamayı açıklar - ki bu iyi değildir. Daha iyi bir isim için, davranışın tam anlamına karşılık gelen "AsSingleton" ı öneririm.
Dünya Motoru

4
left==nullBuradaki çekten nefret ediyorum . Kodun güzelliğini kırar ve kodun daha esnek olmasını durdurur - eğer bir gün ortaya çıkarsanız boş olabilecek bir şeyle bir singleton üretmeniz gerekir? Yani, new T[] { null }aynı değildir new T[] {}ve bir gün onları ayırt etmeniz gerekebilir.
Dünya Motoru

Yanıtlar:


100

Yardımcı yönteminiz bunu yapmanın en temiz yoludur, IMO. Bir listeyi veya diziyi iletirseniz, vicdansız bir kod parçası onu oluşturabilir ve içeriği değiştirebilir, bu da bazı durumlarda garip davranışlara yol açabilir. Salt okunur bir koleksiyon kullanabilirsiniz, ancak bu daha da fazla sarma içerir. Bence çözümünüz olabildiğince temiz.


liste / dizi geçici olarak oluşturulmuşsa, kapsamı yöntem çağrısından sonra sona erer, bu yüzden sorunlara neden olmamalıdır
Mario F

Dizi olarak gönderilirse nasıl değiştirilebilir? Sanırım bir dizi için döküm olabilir ve daha sonra başka bir şey için referans değiştirmek, ama ne iyi olurdu? (Muhtemelen bir şeyleri özlüyorum ...)
Svish

2
İki farklı yönteme geçmek için numaralandırılabilir bir tane oluşturmaya karar verdiğinizi varsayalım ... Birincisi onu bir diziye yayınladı ve içeriği değiştirdi. Daha sonra, değişimin farkında olmadan başka bir yönteme argüman olarak iletirsiniz. Muhtemelen söylemiyorum, sadece olması gerekmediğinde değişebilir bir şeye sahip olmanın naturla değişmezliğinden daha az temiz olduğunu.
Jon Skeet

3
Bu kabul edilmiş bir cevap ve büyük olasılıkla okunacak, bu yüzden endişemi buraya ekleyeceğim. Bu yöntemi denedim, ancak bu tür myDict.Keys.AsEnumerable()nerede önceki derleme çağrımı kırdı . Uzantı yöntemini yeniden adlandırdıktan sonra her şey çalışmaya başladı. IEnumerable <Sözlük <CheckBox, System.Tuple <int, int >>. KeyCollection> 'öğesini' IEnumerable <CheckBox> 'değerine dönüştüremiyor. Açık bir dönüşüm var (oyuncuları özlüyor musun?) Bir süre hackle yaşayabilirim, ancak diğer güç korsanları daha iyi bir yol bulabilir mi? myDictDictionary<CheckBox, Tuple<int, int>>SingleItemAsEnumerable
Hamish Grubijan

3
@HamishGrubijan: Sadece dictionary.Valuesbaşlamak istediğin gibi geliyor . Temelde ne olduğu belli değil, ancak bu konuda yeni bir soru başlatmanızı öneririm.
Jon Skeet

133

Yöntem beklerse IEnumerable, yalnızca bir öğe içeriyor olsa bile liste olan bir şeyi iletmeniz gerekir.

geçen

new[] { item }

argümanın yeterli olması gerektiğini düşünüyorum


32
Ben bile T çıkacak düşünüyorum, (burada çok yanlış olmadıkça: p)
Svish

2
Bence C # 2.0'da çıkarılmamış.
Groo

4
"Dil C #, çerçeve sürüm 2" C # 3 derleyicisi T'yi çıkarabilir ve kod .NET 2 ile tamamen uyumlu olacaktır.
sisve

en iyi cevap en altta mı ?!
Falco Alexander

2
@Svish Bunu yapmak için cevap önerdim ve düzenledim - şimdi
2020'deyiz

120

C # 3.0 sürümünde System.Linq.Enumerable sınıfını kullanabilirsiniz:

// using System.Linq

Enumerable.Repeat(item, 1);

Bu, yalnızca öğenizi içeren yeni bir IEnumerable oluşturur.


26
Bu çözüm kodu okumak zorlaştıracağını düşünüyorum. :( Tek bir öğe üzerinde tekrarlamak oldukça sezgisel değil mi?
Drahakar

6
Bana bir kez ok okuduktan sonra tekrarlayın. Başka bir eklenti yöntemi eklemek ve ad alanının kullanmak istediğiniz yere dahil edilmesini sağlamak zorunda kalmadan çok daha basit bir çözüm.
si618

13
Evet aslında sadece new[]{ item }kendimi kullanıyorum , bunun ilginç bir çözüm olduğunu düşündüm.
luksan

7
Bu çözüm paradır.
ProVega

IMHO bu kabul edilen cevap olmalı. Okuması kolay, özlüdür ve özel bir uzantı yöntemi olmadan BCL'de tek bir satırda uygulanır.
Ryan

35

C # 3'te (2 dediğini biliyorum), sözdizimini biraz daha kabul edilebilir hale getirebilecek genel bir uzantı yöntemi yazabilirsiniz:

static class IEnumerableExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this T item)
    {
        yield return item;
    }
}

istemci kodu o zaman item.ToEnumerable().


Teşekkürler, bunun farkındayım (C # 3.0 kullanıyorsanız .Net 2.0'da çalışır), bunun için yerleşik bir mekanizma olup olmadığını merak ediyordum.
Groo

12
Bu gerçekten güzel bir alternatif. Ben sadece ToEnumerableile System.Linq.Enumerable.AsEnumerable
uğraşmaktan

3
Bir yan not olarak, zaten bir ToEnumerableuzantı yöntemi var IObservable<T>, bu nedenle bu yöntem adı da mevcut kurallara müdahale ediyor. Dürüst olmak gerekirse, sadece çok genel olduğu için bir uzantı yöntemi kullanmamanızı öneririm .
cwharris

14

Bu yardımcı yöntem öğe veya daha fazlası için çalışır.

public static IEnumerable<T> ToEnumerable<T>(params T[] items)
{
    return items;
}    

1
Birden fazla öğeyi desteklediğinden faydalı varyasyon. Ben paramsdizi oluşturmak için dayanır , böylece sonuçta kod temiz görünümlü seviyorum . new T[]{ item1, item2, item3 };Birden fazla öğe için daha fazla veya daha az sevip sevmediğime karar vermedim .
ToolmakerSteve

Akıllı! Seviyorum
Mitsuru Furuta

10

Hiç kimse istemci API basitleştirmek için T tipi bir argüman ile yöntemin yeni bir aşırı yük önermek şaşırdım.

public void DoSomething<T>(IEnumerable<T> list)
{
    // Do Something
}

public void DoSomething<T>(T item)
{
    DoSomething(new T[] { item });
}

Artık müşteri kodunuz bunu yapabilir:

MyItem item = new MyItem();
Obj.DoSomething(item);

veya bir listeyle:

List<MyItem> itemList = new List<MyItem>();
Obj.DoSomething(itemList);

19
Daha da iyisi, DoSomething<T>(params T[] items)derleyicinin tek bir öğeden bir diziye dönüşümü işleyeceği anlamına gelebilir . (Bu ayrıca birden fazla ayrı öğeyi geçirmenize izin verir ve yine, derleyici bunları sizin için bir diziye dönüştürür.)
LukeH

7

Her ikisi de (daha önce söylendiği gibi)

MyMethodThatExpectsAnIEnumerable(new[] { myObject });

veya

MyMethodThatExpectsAnIEnumerable(Enumerable.Repeat(myObject, 1));

Yan not olarak, anonim bir nesnenin boş bir listesini istiyorsanız, son sürüm de güzel olabilir, örn.

var x = MyMethodThatExpectsAnIEnumerable(Enumerable.Repeat(new { a = 0, b = "x" }, 0));

Enumerable olmasına rağmen teşekkürler. Tekrar .Net 3.5 yenidir. Yukarıdaki yardımcı yönteme benzer gibi görünüyor.
Groo

7

Az önce bulduğum ve LukeH kullanıcısının da önerdiği gibi, bunu yapmanın güzel ve basit bir yolu aşağıdaki gibidir:

public static void PerformAction(params YourType[] items)
{
    // Forward call to IEnumerable overload
    PerformAction(items.AsEnumerable());
}

public static void PerformAction(IEnumerable<YourType> items)
{
    foreach (YourType item in items)
    {
        // Do stuff
    }
}

Bu desen, aynı işlevselliği çeşitli şekillerde çağırmanıza olanak tanır: tek bir öğe; birden çok öğe (virgülle ayrılmış); bir dizi; bir liste; bir numaralandırma vb.

AsEnumerable yöntemini kullanarak verimliliği konusunda% 100 emin değilim, ama bir tedavi işe yarıyor.

Güncelleme: AsEnumerable işlevi oldukça verimli görünüyor! ( başvuru )


Aslında, hiç ihtiyacınız yok .AsEnumerable(). Dizi YourType[]zaten uygulanmaktadır IEnumerable<YourType>. Ancak sorum, yalnızca ikinci yöntem (örneğin) mevcut olduğunda ve .NET 2.0'ı kullandığınızda ve tek bir öğe geçirmek istediğinizde söz konusuydu.
Groo

2
Evet, öyle, ama bir yığın taşması bulabileceğinizi göreceksiniz ;-)
teppicymon

Aslında gerçek soru (! Değil tek ben aslında kendim için cevap arıyordu) cevaplamak Ve evet hemen hemen Mario'nun Yanıt başına kadar bir diziye dönüştürmek zorunda
teppicymon

2
Sadece bir IEnumerable<T> MakeEnumerable<T>(params T[] items) {return items;}yöntem tanımlamaya ne dersiniz ? Daha sonra IEnumerable<T>, herhangi bir sayıda farklı öğe için beklenen herhangi bir şeyle kullanılabilir . Kod, tek bir öğeyi döndürmek için özel bir sınıf tanımlamak kadar etkili olmalıdır.
supercat

6

Her ne kadar bir yöntem için aşırı doldurulmuş olsa da, bazı kişilerin Etkileşimli Uzantıları yararlı bulabileceğine inanıyorum.

Microsoft'tan Etkileşimli Uzantılar (Ix) aşağıdaki yöntemi içerir.

public static IEnumerable<TResult> Return<TResult>(TResult value)
{
    yield return value;
}

Hangi gibi kullanılabilir:

var result = EnumerableEx.Return(0);

Ix, orijinal Linq genişletme yöntemlerinde bulunmayan yeni işlevler ekler ve Reaktif Uzantılar (Rx) oluşturmanın doğrudan sonucudur.

Düşün, Linq Extension Methods+ Ix= Rxiçin IEnumerable.

CodePlex üzerinde hem Rx hem de Ix'i bulabilirsiniz .


5

Bu, bu C # derleyici optimizasyonu nedeniyle kullanıldığında yieldveya Enumerable.Repeatkullanıldığında % 30 daha hızlıdır ve diğer durumlarda aynı performansa sahiptir.foreach

public struct SingleSequence<T> : IEnumerable<T> {
    public struct SingleEnumerator : IEnumerator<T> {
        private readonly SingleSequence<T> _parent;
        private bool _couldMove;
        public SingleEnumerator(ref SingleSequence<T> parent) {
            _parent = parent;
            _couldMove = true;
        }
        public T Current => _parent._value;
        object IEnumerator.Current => Current;
        public void Dispose() { }

        public bool MoveNext() {
            if (!_couldMove) return false;
            _couldMove = false;
            return true;
        }
        public void Reset() {
            _couldMove = true;
        }
    }
    private readonly T _value;
    public SingleSequence(T value) {
        _value = value;
    }
    public IEnumerator<T> GetEnumerator() {
        return new SingleEnumerator(ref this);
    }
    IEnumerator IEnumerable.GetEnumerator() {
        return new SingleEnumerator(ref this);
    }
}

bu testte:

    // Fastest among seqs, but still 30x times slower than direct sum
    // 49 mops vs 37 mops for yield, or c.30% faster
    [Test]
    public void SingleSequenceStructForEach() {
        var sw = new Stopwatch();
        sw.Start();
        long sum = 0;
        for (var i = 0; i < 100000000; i++) {
            foreach (var single in new SingleSequence<int>(i)) {
                sum += single;
            }
        }
        sw.Stop();
        Console.WriteLine($"Elapsed {sw.ElapsedMilliseconds}");
        Console.WriteLine($"Mops {100000.0 / sw.ElapsedMilliseconds * 1.0}");
    }

Teşekkürler, sıkı döngülerde GC yükünü azaltmak için bu durum için bir yapı oluşturmak mantıklıdır.
Groo

1
Hem numaralandırıcı hem de numaralandırılabilir döndüğünde kutulu olacak ....
Stephen Drew

2
Kronometre kullanarak karşılaştırma yapmayın. Benchmark.NET kullanın github.com/dotnet/BenchmarkDotNet
NN_

1
Sadece ölçtüm ve new [] { i }seçenek, seçeneğinizden yaklaşık 3.2 kat daha hızlı. Ayrıca seçenek uzatma ile yaklaşık 1,2 kat daha hızlı yield return.
lorond

Başka bir C # derleyici optimizasyonu kullanarak bunu hızlandırabilirsiniz: SingleEnumerator GetEnumerator()Yapınızı döndüren bir yöntem ekleyin . C # derleyicisi arabirim yerine bu yöntemi (ördek yazarak arar) kullanır ve böylece boksu önler. Birçok yerleşik koleksiyon, List gibi bu numarayı kullanır . Not: Bu yalnızca SingleSequenceörneğinizdeki gibi doğrudan bir referansınız olduğunda işe yarayacaktır . Bir IEnumerable<>değişkende
saklarsanız


4

Bu daha iyi olmayabilir ama biraz havalı:

Enumerable.Range(0, 1).Select(i => item);

Değil. Bu farklı.
nawfal

Ewww. Bu, bir öğeyi numaralandırılabilir hale getirmek için çok ayrıntılı.
ToolmakerSteve

1
Bu, kahvaltı yapmak için Rube Goldberg makinesinin kullanılmasına eşdeğerdir . Evet işe yarıyor, ama oraya ulaşmak için 10 çembere atlıyor. Bunun gibi basit bir şey, milyonlarca kez yürütülen sıkı bir döngüde gerçekleştirildiğinde performans darboğazı olabilir. Uygulamada, performans yönü vakaların% 99'unda önemli değildir, ancak şahsen hala aşırı gereksiz aşırı ağırlama olduğunu düşünüyorum.
enzi

4

@ EarthEngine'ın orijinal yayına yaptığı yorumlara katılıyorum, yani 'AsSingleton' daha iyi bir isim. Bu wikipedia girişine bakın . Daha sonra singleton tanımından, null değeri bir argüman olarak iletilirse, 'AsSingleton', tartışmayı çözecek boş bir IEnumerable yerine tek bir null değerine sahip bir IEnumerable döndürmelidir if (item == null) yield break;. Bence en iyi çözüm iki yönteme sahip olmaktır: 'AsSingleton' ve 'AsSingletonOrEmpty'; burada, bir null değişkeninin bağımsız değişken olarak iletilmesi durumunda, 'AsSingleton' tek bir null değer döndürür ve 'AsSingletonOrEmpty' boş bir IEnumerable döndürür. Bunun gibi:

public static IEnumerable<T> AsSingletonOrEmpty<T>(this T source)
{
    if (source == null)
    {
        yield break;
    }
    else
    {
        yield return source;
    }
}

public static IEnumerable<T> AsSingleton<T>(this T source)
{
    yield return source;
}

Daha sonra, bunlar az çok IEnumerable üzerindeki 'First' ve 'FirstOrDefault' genişletme yöntemlerine benzeyecek ve bu da doğru geliyor.


2

Söylememin en kolay yolu new T[]{item};; bunu yapacak bir sözdizimi yok. Aklıma gelen en yakın eşdeğer paramsanahtar kelimedir, ancak elbette yöntem tanımına erişmenizi gerektirir ve yalnızca dizilerle kullanılabilir.


2
Enumerable.Range(1,1).Select(_ => {
    //Do some stuff... side effects...
    return item;
});

Yukarıdaki kod, like gibi kullanıldığında yararlıdır

var existingOrNewObject = MyData.Where(myCondition)
       .Concat(Enumerable.Range(1,1).Select(_ => {
           //Create my object...
           return item;
       })).Take(1).First();

Yukarıdaki kod snippet'inde boş / boş denetim yoktur ve istisnalardan korkmadan yalnızca bir nesnenin döndürülmesi garanti edilir. Ayrıca, tembel olduğu için kapatma, kriterlere uygun veri bulunmadığı kanıtlanana kadar yürütülmeyecektir.


Bu yanıt otomatik olarak "düşük kalite" olarak etiketlendi. Açıklandığı gibi yardımıyla ( "Brevity kabul edilebilir, ancak daha dolgun açıklamalar iyidir.") Düzenlemek sizin kod hakkında olduğunu, o yanlış yaptığını OP anlatmak için yeterli.
Sandra Rossi

Yanıt verdiğim bölüm de dahil olmak üzere bu cevabın büyük bir kısmının daha sonra başka biri tarafından düzenlendiğini görüyorum. eğer ikinci snippet'in niyet varsayılan bir değer sağlamaktır ama eğer MyData.Where(myCondition)boş, zaten mümkün (ve daha basit) var DefaultIfEmpty(): var existingOrNewObject = MyData.Where(myCondition).DefaultIfEmpty(defaultValue).First();. Bu, özel bir değer değil, var existingOrNewObject = MyData.FirstOrDefault(myCondition);isterseniz daha da basitleştirilebilir default(T).
BACON

0

Partiye biraz geç kaldım ama yine de yolumu paylaşacağım. Benim sorunum ItemSource veya WPF TreeView tek bir nesneye bağlamak istedim oldu. Hiyerarşi şöyle görünür:

Proje> Arsalar> Oda (lar)

Her zaman sadece bir proje olacaktı, ama yine de projeyi Ağaçta Göstermek istedim, bazılarının önerdiği gibi içinde sadece bir nesne olan bir Koleksiyon geçirmek zorunda kalmadan.
Yalnızca IEnumerable nesnelerini ItemSource olarak iletebildiğiniz için sınıfımı IEnumerable yapmaya karar verdim:

public class ProjectClass : IEnumerable<ProjectClass>
{
    private readonly SingleItemEnumerator<AufmassProjekt> enumerator;

    ... 

    public IEnumerator<ProjectClass > GetEnumerator() => this.enumerator;

    IEnumerator IEnumerable.GetEnumerator() => this.GetEnumerator();
}

Ve buna göre kendi Numaralandırıcımı oluştur:

public class SingleItemEnumerator : IEnumerator
{
    private bool hasMovedOnce;

    public SingleItemEnumerator(object current)
    {
        this.Current = current;
    }

    public bool MoveNext()
    {
        if (this.hasMovedOnce) return false;
        this.hasMovedOnce = true;
        return true;
    }

    public void Reset()
    { }

    public object Current { get; }
}

public class SingleItemEnumerator<T> : IEnumerator<T>
{
    private bool hasMovedOnce;

    public SingleItemEnumerator(T current)
    {
        this.Current = current;
    }

    public void Dispose() => (this.Current as IDisposable).Dispose();

    public bool MoveNext()
    {
        if (this.hasMovedOnce) return false;
        this.hasMovedOnce = true;
        return true;
    }

    public void Reset()
    { }

    public T Current { get; }

    object IEnumerator.Current => this.Current;
}

Bu muhtemelen "en temiz" çözüm değil ama benim için çalıştı.

EDIT @Groo'nun işaret ettiği gibi tek sorumluluk ilkesini
desteklemek için yeni bir sarmalayıcı sınıfı oluşturdum:

public class SingleItemWrapper : IEnumerable
{
    private readonly SingleItemEnumerator enumerator;

    public SingleItemWrapper(object item)
    {
        this.enumerator = new SingleItemEnumerator(item);
    }

    public object Item => this.enumerator.Current;

    public IEnumerator GetEnumerator() => this.enumerator;
}

public class SingleItemWrapper<T> : IEnumerable<T>
{
    private readonly SingleItemEnumerator<T> enumerator;

    public SingleItemWrapper(T item)
    {
        this.enumerator = new SingleItemEnumerator<T>(item);
    }

    public T Item => this.enumerator.Current;

    public IEnumerator<T> GetEnumerator() => this.enumerator;

    IEnumerator IEnumerable.GetEnumerator() => this.GetEnumerator();
}

Hangi şekilde kullandım

TreeView.ItemSource = new SingleItemWrapper(itemToWrap);

DÜZENLEME 2 Yöntemle ilgili
bir hatayı düzelttim MoveNext().


SingleItemEnumerator<T>Sınıf mantıklı ama bir sınıf "tek bir birim haline IEnumerablekendisinin" tek bir sorumluluk ilkesinin ihlali gibi görünüyor. Belki de onu daha pratik hale getirir, ancak yine de gerektiği gibi sarmayı tercih ederim.
Groo

0

"Mutlaka iyi bir çözüm değil, ama yine de ... bir çözüm" veya "Aptal LINQ hileleri" altında dosyalanabilmek Enumerable.Empty<>()için Enumerable.Append<>()...

IEnumerable<string> singleElementEnumerable = Enumerable.Empty<string>().Append("Hello, World!");

... ya da Enumerable.Prepend<>()...

IEnumerable<string> singleElementEnumerable = Enumerable.Empty<string>().Prepend("Hello, World!");

Son iki yöntem .NET Framework 4.7.1 ve .NET Core 1.0'dan beri kullanılabilir.

Bu seferki olsaydı çalışılabilir bir çözüm gerçekten var olan yöntemlerle yerine bundan daha az ya da açık olup olmadığını kararsız değilim ama kendi yazmaya niyet çözümü . Bu kesinlikle daha uzun bir koddur (kısmen tür parametre çıkarımının mümkün olmaması nedeniyleEnumerable.Repeat<>()Empty<>() ) ve iki kat daha fazla numaralandırıcı nesnesi oluşturur.

Bunu "Bu yöntemlerin var olduğunu biliyor muydunuz?" cevap, Array.Empty<>()yerine kullanılabilir Enumerable.Empty<>(), ancak durumu daha iyi hale getirdiğini iddia etmek zor ...


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.