3

読み取るファイルの名前に基づいて4つの文字列値を設定する必要がある自動ワークフローシステムを構築しています。私は機能しているswitchステートメントを持っていますが、例でわかるように、異なるファイル名の間で多くの共有値があります。間もなく40もの異なるファイル名を使用できるようになるので、このコードを合理化する方法を探しています。

各ファイルには、AccountName、CampaignName、DocumentName、およびDestinationNameのプロパティを割り当てる必要があります。アカウントとキャンペーンは類似したファイル間で頻繁に共有されますが、ドキュメントはほとんどの場合一意です。例については、以下を参照してください。

case "Cow":
    accountName = "Farm Animals";
    campaignName = "Quadrupeds";
    documentName = "Milk Givers";
    destinationName = "Milking Line";
    break;
case "Chicken":
    accountName = "Farm Animals";
    campaignName = "Bipeds";
    documentName = "Egg Layers";
    destinationName = "Coupe";
    break;
case "Turkey":
    accountName = "Farm Animals";
    campaignName = "Bipeds";
    documentName = "Dinner";
    destinationName = "My Table";
    break;
case "Dog":
    accountName = "Farm Animals";
    campaignName = "Quadrupeds";
    documentName = "Best Friend";
    destinationName = "Front Porch";
    break;
case "Pig":
    accountName = "Farm Animals";
    campaignName = "Quadrupeds";
    documentName = "Bacon";
    destinationName = "My Plate";
    break;

辞書が私が探しているものであるかどうか、またはLINQを使用して値を選択できるカスタムクラスを構築するかどうかはわかりません。そのため、ここにいます。

値の繰り返しを減らして管理しやすくしたいと思います。さまざまな値とそれらに属するドキュメントを保持するマイクロリレーショナルデータベースのようなもの。

私の質問は次のとおりです。switchステートメントなしでこれにアプローチするためのより良い方法はありますか?そして、私が必要とするものに基づいて、私の質問のより良い名前はありますか?

4

5 に答える 5

3

以下に説明するように辞書を使用できます:-

    public  class ElementName
    {
        public string AccountName { get; set; }
        public string CampaignName { get; set; }
        public string DocumentName { get; set; }
        public string DestinationName { get; set; }
    }
        var animalNameDict = new Dictionary<string, ElementName>
            {
                {
                    "cow",
                    new ElementName
                        {
                            AccountName = "Farm Animals",
                            CampaignName = "Quadrupeds",
                            DocumentName = "Milk Givers",
                            DestinationName = "Milking line"
                        }
                }
            };
        ElementName elem = null;
        animalNameDict.TryGetValue("cow", out elem);

        var item = animalNameDict.FirstOrDefault(x => x.Key == "cow");

または、クラスのリストに変換して、linq拡張機能ToLookupを使用することもできます。

于 2013-01-25T19:50:16.357 に答える
2

OK、つまり、各パラメータは、各動物に関して1対多の関係です。Dictionary<string, List<string>>私の解決策は、次のようなタイプの各パラメーターの辞書を作成することです。

var accountNames = new Dictionary<string, List<string>>
    {
        {"Farm Animals", new List<string> {"Cow", "Chicken", "Turkey", "Dog", "Pig"}}
    };

次に、これと同様の方法で使用します(この例では匿名型を使用します)。値を取得するための拡張メソッドを作成して、コードをクリーンアップし、大文字と小文字を区別しないようにすることができます。

foreach(var animal in animals)
{
    var item = new
        {
            AccountName = accountNames.First(x => x.Value.Contains(animal)).Key
        };
}
于 2013-01-25T20:17:17.313 に答える
1

コードの行数を減らす方法は実際にはありません。何を知っているか、どこaccountNamecampaignNameに何かを配線せずに選択する方法がないからです。TYYが提案するように辞書を設定できますが、それでもファイルごとに4つの割り当てが必要です(タイプ?)。

いずれにせよ、少なくとも、やなどの一般的な文字列"Farm Animals""Quadrupeds"定数として定義して、type-osの可能性を減らし、必要に応じて変更しやすくすることをお勧めします。

于 2013-01-25T20:06:40.030 に答える
1

リフレクションを使用して、ファクトリを使用して動物を作成することを検討してください。

namespace mynamespace
{
    public class FarmAnimal
    {
        public string accountName = "Farm Animals";
    }
    public class Quadruped : FarmAnimal
    {
        public string campaignName = "Quadrupeds";
    }
    public class Dog : Quadruped
    {
        public string documentName = "Best Friend";
        public string destinationName = "Front Porch";

        public override string ToString()
        {
            return String.Format("{0} : {1} : {2} : {3}", accountName, campaignName, documentName, destinationName);
        }
    }

    public class AnimalFactory
    {
        public static FarmAnimal create(string fileName)
        {
            try {
                ObjectHandle h = Activator.CreateInstance(null, "mynamespace." + fileName);
                return  (FarmAnimal)h.Unwrap();
            }
            catch (Exception) {
                return null;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            FarmAnimal a = AnimalFactory.create("Dog");
            Console.WriteLine(a);
        }
    }
}
于 2013-01-25T20:11:23.560 に答える
0

アプローチは、ファクトリまたはプロトタイプを使用することです。このようにして、このコードを別のプロジェクトに委任して、好きなことを行うことができます。

于 2013-01-25T19:40:59.240 に答える