هل من الممكن أن تنفجر مجموعة بحيث عناصرها يمكن أن تنتقل إلى أسلوب مع params الكلمة ؟

StackOverflow https://stackoverflow.com/questions/192715

سؤال

خذ هذا غير ترجمة التعليمات البرمجية على سبيل المثال:

public string GetPath(string basefolder, string[] extraFolders)
{
    string version = Versioner.GetBuildAndDotNetVersions();
    string callingModule = StackCrawler.GetCallingModuleName();
    return AppendFolders(basefolder, version, callingModule, extraFolders);
}
private string AppendFolders(params string[] folders)
{
    string outstring = folders[0];
    for (int i = 1; i < folders.Length; i++)
    {
        string fixedPath = folders[i][0] == '\\' ? folders[i].Substring(1) : folders[i];
        Path.Combine(outstring, fixedPath);
    }
    return outstring;
}

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

هل هناك طريقة "تنفجر" في extraFolders مجموعة بحيث انها المحتويات يمكن أن تنتقل إلى AppendFolders جنبا إلى جنب مع غيرها من المعلمات ؟

هل كانت مفيدة؟

المحلول

خيار واحد هو جعل params المعلمة object[]:

static string appendFolders(params object[] folders)
 { return (string) folders.Aggregate("",(output, f) => 
                       Path.Combine( (string)output
                                    ,(f is string[]) 
                                      ? appendFolders((object[])f)
                                      : ((string)f).TrimStart('\\')));
 }

إذا كنت تريد شيئا أكثر المكتوبة بشدة, وثمة خيار آخر هو إنشاء مخصص الاتحاد مع نوع التحويل الضمني المشغلين:

  static string appendFolders(params StringOrArray[] folders)
     { return folders.SelectMany(x=>x.AsEnumerable())
                     .Aggregate("",
                       (output, f)=>Path.Combine(output,f.TrimStart('\\')));
     }

   class StringOrArray
     { string[] array;

       public IEnumerable<string> AsEnumerable()
        { return soa.array;}

       public static implicit operator StringOrArray(string   s)   
        { return new StringOrArray{array=new[]{s}};}

       public static implicit operator StringOrArray(string[] s)  
        { return new StringOrArray{array=s};}
     }

في كلتا الحالتين ، سوف ترجمة:

appendFolders("base", "v1", "module", new[]{"debug","bin"});

نصائح أخرى

ومجرد تمريرها. المعلمة المجلدات عبارة عن صفيف أولا. وظائف "بارامس" هو القليل من السحر مترجم، ولكن هذا ليس هو المطلوب.

AppendFolders(extraFolders);

والآن، وهذه الحالة particulat، سيكون لديك لإضافة بعض الأشياء إلى أن مجموعة، أولا.

List<string> lstFolders = new List<string>(extraFolders);
lstFolder.Insert(0, callingModule);
lstFolder.Insert(0, version);
lstFolder.Insert(0, basefolder);
return AppendFolders(lstFolders.ToArray());

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

return AppendFolders(new string[] { basefolder, version, callingModule }.Concat(extraFolders).ToArray());

وتحرير:

وبينما لا يمكنك إضافة مشغل عبر طرق الإرشاد، هل يمكن أن تفعل:

return AppendFolders(new string[] { baseFolder, callingModuleName, version }.Concat(extraFolders));

public static T[] Concat<T>(this T[] a, T[] b) {
   return ((IEnumerable<T>)a).Concat(b).ToArray();
}

ولكن، إذا نحن في طريقنا للذهاب إلى هذا الحد - قد كذلك مجرد توسيع قائمة للتعامل مع هذا أنيق:

return AppendFolders(new Params<string>() { baseFolder, callingModuleName, version, extraFolders });

class Params<T> : List<T> {
    public void Add(IEnumerable<T> collection) {
       base.AddRange(collection);
    }

    public static implicit operator T[](Params<T> a) {
       return a.ToArray();
    }
}

وهناك حل سريع وقذرة سيكون لبناء قائمة <سلسلة> من البنود ومن ثم تمرير ذلك (مع ToArray ()).

ملحوظة التي لا تحتاج لاختبار ومائل. Path.Combine يعالج الأشياء القذرة بدلا غرامة .

وأعتقد أن الجواب OregonGhost هي على الأرجح الطريقة التي تريد أن تذهب. فقط لتوضيح ذلك، وقال انه يشير تفعل شيئا من هذا القبيل:

public string GetPath(string basefolder, string[] extraFolders)
{
    string version = Versioner.GetBuildAndDotNetVersions();
    string callingModule = StackCrawler.GetCallingModuleName();

    List<string> parameters = new List<string>(extraFolders.Length + 3);
    parameters.Add(basefolder);
    parameters.Add(version);
    parameters.Add(callingModule);
    parameters.AddRange(extraFolders);
    return AppendFolders(parameters.ToArray());
}

وأنا لا أقصد أن تكون عبرة حول كيفية استخدام قوائم، تماما كما توضيح القليل عن أي شخص قد تأتي على طول تبحث عن حل في المستقبل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top