Soru C #: int x belirli bir kümenin öğesi olup olmadığını sınamanın en zarif yolu?


Sorun: x ∉ {2, 3, 61, 71} değerini test edin.

Bundan daha iyi bir yol olmadığını merak ettim:

if (x != 2 && x != 3 && x != 61 && x != 71)
{
  // do things
}

ve

if (!new List<int>{ 2, 3, 61, 71 }.Contains(x))
{
  // do things
}

İkincisi oldukça zarif gözüküyor, ama aslında okunduğunda, özellikle de tersine çevirdiğinden dolayı rahatsız edici oluyor. Çirkin bir şey çünkü İngilizce'de söyledik "x, öğesinin ..."C # içinde havai tahriş etmeden ifade etmek zor. Belki bir coud if (Object(x).IsElementOf(new[] { ... })) ya da öylesine

Hmm .. herhangi bir öneri? Bunun gibi şeyleri test etmek için herhangi bir standart standart yöntem var mı?


25
2017-11-22 15:00


Menşei


Bu bir kopya ama diğer sorumu kendim bulmakta biraz zorlanıyorum ... - BoltClock♦
Kapatmak için oy kullanamam, bitti ama stackoverflow.com/questions/163732/... - user7116
@Erain, demek istedin && yerine ||? İki kod parçacığı aynı şeyi yapmaz ... - Thomas Levesque
Ben bir C # geliştiricisi değilim, ama kesinlikle listelenen diğerlerinden daha fazla kaçınmaya çalıştığınız basit yaklaşıma çekiyorum. Gerçekten başkalarının neden daha iyi olabileceğini anlamıyorum. Gerekli olmadığında daha fazla kod, daha fazla talimat ve döngü gerektirirler. - user606723
@Efrain Sadece düzenlediğinizde anlamlı değil. Şu anda gönderilen ifade, bir sayı farklı olacağından anlam ifade etmiyor. bir bunları kullanırken ||, dolayısıyla yorum ve düzenleme. Bu nedenle, sorunuz artık mantıklı değil. Geri çekiyorum. Eğer sen Gerçekten mi OR kullanmak demek, lütfen açıkça yanlış olduğu için soruyu silmeyi düşünün. - Lasse Vågsæther Karlsen


Cevaplar:


Bir uzantı yöntemi kullanıyorum:

using System.Linq;

...

public static bool In<T>(this T item, params T[] list)
{
    return list.Contains(item);
}

...


if (!x.In(2,3,61,71))
...

Olarak yeniden adlandırabilirsiniz IsElementOf Bu ismi tercih edersen ...


42
2017-11-22 15:05



Merak edenler için not Contains dizideki yöntem LINQ ad alanları tarafından sağlanır. - Adam Houldsworth
@AdamHouldsworth, iyi nokta, teşekkürler. Bunu netleştirmek için gerekli kullanım şartını ekledim - Thomas Levesque
Sorun değil, çok tatlı bir parça için her iki yol da +1. İtiraf etmekten utanmıyorum çünkü muhtemelen gelecekte bunu anlamayacağım :-) - Adam Houldsworth
<micro-optimizasyon> Eğer bu metodun çok fazla ve / veya çok sayıda elemente karşı kullanılması isteniyorsa, o zaman hafif bir iyileşme elde edebilirsiniz. Array.IndexOf(list, item) != -1 dahili olarak LINQ yerine Contains yöntemi. </ mikro optimizasyonu> - LukeH
@LukeH, haklısın, daha verimli olurdu. Ancak bu yöntemin çok sayıda elemente karşı kullanılmasını beklemiyordum, bu yüzden muhtemelen fark edilebilir bir fark yaratmayacaktı ... - Thomas Levesque


Eski soru, ama bu basit cevabı görmedim:

!new []{2, 3, 61, 71}.Contains(x)

6
2017-09-19 20:25





Aşağıdaki LinQ yöntemini kullanabilirsiniz:

var list = new List<int> { 1, 2, 3, 4, 5 };
var number = 3;

if (list.Any(item => item == number))
    //number is in the list

Ve okunabilirlik için bunu bir uzantı yöntemine koyabilirsiniz:

public static bool IsElementOf(this int n, IEnumerable<int> list)
{
    return list.Any(i => n == i);
}

//usage
if(3.IsElementOf(list)) //in the list

5
2017-11-22 15:11





ne dersin

if(new[] { 2, 3, 61, 71 }.Except(x).FirstOrDefault() != 0)
{
   ...
}

ya da bu hatlardaki bir şey?


1
2017-11-22 15:41





var list=CreateNewList(); //returns your list of elements
var element=GetElement(); //returns an element that might be in the list
if(list.Any(x=>x.Equals(element))
{
  //do something
}

Hala alışkın olduğunuzdan tersine çevriliyor ama daha etkileyici (eğer listenin öğeye eşit bir değeri varsa).


0
2017-11-22 15:06





&& ve değil || kastettiğinizi varsayarak, sadece bir func yazabilir ve bunu kodunuz boyunca kullanabilirsiniz. Yeni [] bölümünü kısaltabilirsiniz, çünkü int (int), func parametresinde bulunur.

Func<int, bool> IsSafe = x => !new[] { 2, 3, 61, 71 }.Contains(x);

Console.WriteLine(IsSafe(68)); // is true
Console.WriteLine(IsSafe(2));  // is false

0
2017-11-22 15:16