0

以下のプログラムを書くためのより良い方法はありますか(私はそれができると確信していますが、どのように)

for (int i = 0; i < relevantElements.Count(); i++)
            {
                switch (len)
                {
                    case 1: result.Add(new ContextElements
                    {
                        CultureName = GetElementValues(relevantElements[0], applicationType)
                        ,
                        AffId = null
                        ,
                        EmailAddress = null
                    }); 
                        break;
                    case 2:
                    result.Add(new ContextElements
                    {
                        CultureName = GetElementValues(relevantElements[0], applicationType)
                        ,
                        AffId = GetElementValues(relevantElements[1], applicationType)
                        ,
                        EmailAddress = null
                    }); 
                        break;
                    case 3:
                        result.Add(new ContextElements
                        {
                            CultureName = GetElementValues(relevantElements[0], applicationType)
                            ,
                            AffId = GetElementValues(relevantElements[1], applicationType)
                            ,
                            EmailAddress = GetElementValues(relevantElements[2], applicationType)
                        });
                        break;
                }
            }

ありがとう

編集

ソースxmlファイルがあります

<?xml version="1.0" encoding="utf-8"?>

<RootElement>

  <HomeSite>

   <Context enabled="1" active="1">

      <Culture>en-us</Culture>

      <Affiliate>0</Affiliate>

      <EmailAddress>sreetest@test.com</EmailAddress>

      <Password>sreesree1</Password>

    </Context>

  </HomeSite>

  <ResourceManager>

    <Context enabled="1" active="1">

      <Culture>en-us</Culture>

      <Affiliate>0</Affiliate>

    </Context>

  </ResourceManager>  

  <Purchase>

     <Context enabled="1" active="1">

      <PurchaseUrl>http://purchase.mcafee.com?culture=en-us&amp;affid=0</PurchaseUrl>

    </Context>

    <Context enabled="0" active="0">

      <PurchaseUrl>http://purchase.mcafee.com?culture=en-gb&amp;affid=0</PurchaseUrl>

    </Context>

  </Purchase>  

</RootElement>

「HomeSite」アプリケーションタイプで理解できるように、「Context」要素の下には、Culture、Affiliate、EmailAddressの3つの要素があります。ただし、これは他のアプリケーションタイプ「ResourceManager」および「Purchase」から変更されています。私はまた、以下のようなカスタムエンティティを持っています

public class ContextElements

{
    public string CultureName { get; set; }

    public string AffId { get; set; }

    public string EmailAddress { get; set; }

}

課題は、実行時にプロパティ値を入力する必要があることです。3を超えることはできません。

私の完全なプログラム(ただし、改善されたコードが必要です)

class Program
    {       
        static void Main(string[] args)
        {
            XDocument xmlSkuDescDoc = null;

            xmlSkuDescDoc = XDocument.Load(@"D:\Config.xml");

            string applicationType = ApplicationType.Purchase.ToString();

            var result = new List<ContextElements>();

            var elementCollection = new List<string>();


            (from data in xmlSkuDescDoc.Descendants(applicationType)
             select data)
                     .Descendants("Context")
                     .Elements()
                     .ToList()
                     .ForEach(i => elementCollection.Add(i.Name.ToString()));

           //Exclude unwanted elements
            var relevantElements = elementCollection.Except(new List<string> { "Password" }).ToList();

            int len = relevantElements.Count();

            for (int i = 0; i < relevantElements.Count(); i++)
            {
                switch (len)
                {
                    case 1: result.Add(new ContextElements
                    {
                        CultureName = GetElementValues(relevantElements[0], applicationType)
                        ,
                        AffId = null
                        ,
                        EmailAddress = null

                    }); 
                        break;
                    case 2:
                    result.Add(new ContextElements
                    {
                        CultureName = GetElementValues(relevantElements[0], applicationType)
                        ,
                        AffId = GetElementValues(relevantElements[1], applicationType)
                        ,
                        EmailAddress = null
                    }); 
                        break;
                    case 3:
                        result.Add(new ContextElements
                        {
                            CultureName = GetElementValues(relevantElements[0], applicationType)
                            ,
                            AffId = GetElementValues(relevantElements[1], applicationType)
                            ,
                            EmailAddress = GetElementValues(relevantElements[2], applicationType)
                        });
                        break;
                }
            }

           // //just for printing
           result.ForEach(i => Console.WriteLine(string.Format("CultureName = {0} , AffId = {1} , EmailAddress = {2} ", i.CultureName, i.AffId, i.EmailAddress)));

            Console.ReadKey();

        }

        private static string GetElementValues(string elementName,string applicationType)
        {
             XDocument xmlSkuDescDoc = null;

            xmlSkuDescDoc = XDocument.Load(@"D:\Config.xml");

            return (from data in

                             (from data in xmlSkuDescDoc.Descendants(applicationType)

                              select data).Descendants("Context")

                    select new { Value = (string)data.Element(elementName)}).FirstOrDefault().ToString();
        }

        public enum ApplicationType
        {
            HomeSite = 1
            ,
            ResourceManager
                ,
            ApplicationProvisioning
                ,
            Purchase
                ,
            GAC
           , WebSVCService
        }
    }
4

3 に答える 3

1

同じ動作でコードを単純に機械的に書き直すと、次のようになります。

for (int i = 0; i < relevantElements.Count(); i++)
{
    result.Add(new ContextElements
    {
        CultureName = GetElementValues(relevantElements[0], applicationType),
        AffId = len < 2 ? null : GetElementValues(relevantElements[1], applicationType),
        EmailAddress = len < 3 ? null : GetElementValues(relevantElements[2], applicationType),
    }); 
}

とはいえ、このコードが何をしようとしているのか、それが正しく行われているのかはわかりません。

于 2012-05-09T13:57:04.793 に答える
0

さて、あなたはこの方法でコードをわずかに改善することができます:

var cultureName = GetElementValues(relevantElements[0], applicationType);
AffIdType affId = null; // replace with the actual type
EmailAddressType emailAddress = null; // ditto

switch (len)
{
    case 2:
        AffId = GetElementValues(relevantElements[1], applicationType);
        break;
    case 3:
        AffId = GetElementValues(relevantElements[1], applicationType);
        EmailAddress = GetElementValues(relevantElements[2], applicationType);
        break;
}
for (int i = 0; i < relevantElements.Count(); i++)
{
    result.Add(new ContextElements
    {
        CultureName = cultureName,
        AffId = affId,
        EmailAddress = emailAddress
    });
}

AffId(私はあなたのコードがsとEmailAddressesが異なるオブジェクトであることに依存していないと思います。)

于 2012-05-09T14:00:52.877 に答える
0

少なくとも次のことができます。

var culture = GetElementValues(relevantElements[0], applicationType); 
var affId = GetElementValues(relevantElements[1], applicationType); 

for (int i = 0; i < relevantElements.Count(); i++) 
        { 
            switch (len) 
            { 
                case 1: 
                result.Add(new ContextElements 
                { 
                    Culture = culture, 
                    AffId = null, 
                    EmailAddress = null 
                });  
                    break; 
                case 2: 
                result.Add(new ContextElements 
                { 
                    Culture = culture, 
                    AffId = affId,
                    EmailAddress = null 
                });  
                    break; 
                case 3: 
                    result.Add(new ContextElements 
                    { 
                        Culture = culture, 
                        AffId = affId,
                        EmailAddress = GetElementValues(relevantElements[2], applicationType) 
                    }); 
                    break; 
            } 
        } 
于 2012-05-09T14:08:03.723 に答える