سؤال

هل هناك طريقة في .صافي (أو نوعا من معيار أساليب الإرشاد) لطرح الأسئلة من التعداد?

على سبيل المثال هو العنصر الحالي العنصر الأول أو الأخير في التعداد:

string s = "";

foreach (var person in PeopleListEnumerator) {

  if (PeopleListEnumerator.IsFirstItem) s += "[";

  s += person.ToString();

  if (!PeopleListEnumerator.IsLastItem) s += ",";
  else s += "]";
}
هل كانت مفيدة؟

المحلول

وفقط من أجل المتعة، وإيجاد حل لهذه المشكلة العامة التي لا تتطلب تقييم حريصة ولديها متغير محلي واحد (باستثناء العداد):

static class TaggedEnumerableExtensions
{
    public class TaggedItem<T>
    {
        public TaggedItem(T value, bool isFirst, bool isLast)
        {
            IsFirst = isFirst;
            IsLast = isLast;
            Value = value;
        }
        public T Value { get; private set; }
        public bool IsFirst { get; private set; }
        public bool IsLast { get; private set; }
    }
    public static IEnumerable<TaggedItem<T>> ToTaggedEnumerable<T>(this IEnumerable<T> e)
    {
        using (var enumerator = e.GetEnumerator()) {
            if (!enumerator.MoveNext())
                yield break;
            var current = enumerator.Current;
            if (!enumerator.MoveNext()) {
                yield return new TaggedItem<T>(current, true, true);
                yield break;
            } else {
                yield return new TaggedItem<T>(current, true, false);
            }

            for (;;) {
                current = enumerator.Current;
                if (!enumerator.MoveNext()) {
                    yield return new TaggedItem<T>(current, false, true);
                    yield break;
                }
                yield return new TaggedItem<T>(current, false, false);
            }
        }
    }
}

والاختبار:

class Program
{
    static void Main(string[] args)
    {
        foreach (var item in Enumerable.Range(0, 10).ToTaggedEnumerable()) {
            Console.WriteLine("{0} {1} {2}", item.IsFirst, item.IsLast, item.Value);
        }
    }
}

نصائح أخرى

إذا مجموعتك هو قائمة، يمكنك القيام به:

string s = "[" + String.Join(",", PeopleList.ToArray()) + "]";

لا أعرف.يمكنك أن تجرب كتابة مثل هذه أساليب الإرشاد نفسك ، على الرغم من.أو تتبع أول/البند الأخير في مكان آخر.

إريك ليبرت كان بلوق وظيفة حول هذا النوع من المشاكل في الآونة الأخيرة جنبا إلى جنب مع بعض الأفكار حول كيفية تعديل وصف المشكلة إلى أكثر من ذلك تعكس بدقة ما تريده فعلا.

ربما أنت أفضل حالا باستخدام السلسلة.الانضمام مع بعض LINQ في هذه الحالة:

String.Join(
  ",",
  (from p in PeopleListEnumerator
  select p.ToString()).ToArray()
)

واجهة IEnumerable لا يعرف أو يتوقع العناصر التي تقوم بإرجاع أن تكون في أي ترتيب معين. وبالتالي فإن مفهوم "أولا" لا تنطبق دائما.

ولكن، لهذا نمط معين هذا هو ما أقوم به

StringBuilder result = new StringBuilder();
result.Append( '[' );

foreach( var person in PeopleListEnumerator )
{
    if( result.Length > 1 )
        result.Append( ',' );
    result.Append( person.ToString() );
}

result.Append( ']' );

وجون السكيت كتب الذكية التعدادات لتوفير هذا النوع من الوظائف، وأنهم جزء من مكتبة MiscUtils .

وقال ان مثال محدد الخاص بك هو أفضل حل من قبل نهج String.Join () عن العديد من الآخرين قد أشار إلى. كتابة تمديد string Join(this IEnumerable<T>,string) العام هو ليس من الصعب وغير قابلة للاستخدام بعد ذلك في أي مزيد من الحالات دون الحاجة إلى اللجوء إلى صفائف مؤقتة مزعج.

<ع> استخدام LINQ، يمكنك القيام به:

string s = 
    string.Format("[{0}]", string.Join(",",PeopleListEnumerator.Select(p => p.ToString()).ToArray()));

وأجد نفسي تحديد واستخدام "منطقي الأول" المتغير المحلي، على سبيل المثال:

string s = "[";
bool first = true;

foreach (var person in PeopleListEnumerator) {

  if (first)
    first = false;
  else
    s += ",";
  s += person.ToString();
}
s += "]";

وهذا الرمز مباريات عن كثب ما كنت تريد حقا أن تحقيق:

StringBuilder s = new StringBuilder("[");
string delimiter = "";

foreach (var person in PeopleListEnumerator) {  
  s.Append(delimiter).Append(person.ToString());
  delimiter = ",";
}

return s.Append("]").ToString();

والطريقة فما استقاموا لكم فاستقيموا الجلد هذا القط (نعم، هناك العديد من الطرق التي) ستكون كما يلي:

StringBuilder sb = new StringBuilder();

foreach (var person in PeopleListEnumerator )
{
    sb.AppendFormat(",{0}", person.ToString());
}

string s = "[" + sb.ToString().Substring(1) + "]";

ويساعد هذا الأمل ...

في التعدادات. NET ليس لديهم مفهوم النظام، إلا من حيث القيمة. إذا كنت ترغب في التعداد الأول والأخير أود أن أقترح تحديد بوضوح ما هي هذه القيم الأولى والأخيرة. التعداد التالي هو مثال على ذلك:

public enum PlayerType : byte
{
    Starter = byte.MinValue,
    RegularPlayer = 1,
    BenchWarmer = 2,
    Closer = byte.MaxValue
}

ويمكنك بعد ذلك تعبير عن شيء مشابه لما يلي:

List<byte> values = new List<byte>((byte[])Enum.GetValues(typeof(PlayerType)));

PlayerType starter = (PlayerType)values.Min();
PlayerType closer = (PlayerType)values.Max();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top