2

私の問題は、可変量のパラメーターを取るメソッドがあることです。

new ClassName(p1, p2)これらの各パラメーターはオブジェクトです。実際の問題は、そのメソッドのすべてのパラメーターを記述すると非常に冗長になることにあります。

p1andを送信する方法はありますかまたはのいずれかp2の形式で単一のパラメーターとして{p1, p2}(p1, p2)

Insert(("John", "Doe"), ("Sherlock", "Holmes"), ... etc)書くのではなく、メソッド自体でそれらを書き込んでニュースに渡すことができるようにInsert(new Person("John", "Doe"), new Person("Sherlock", "Holmes"), ... etc)

F# と scala のタプルがこのようにできることは知っていますが、C# でタプルを使用するとコードがさらに長くなります。

冗長にする方法はありますか?

編集:新しい配列や新しいリストを作成しようとしているのではなく、 new キーワードをできるだけ避けたい

Edit2: Insert メソッドがどのように見えるかを確認するように要求した人もいました。現在、次のようになっています。

public void Insert(params Person[] arr)
{
    //inserts the person in a hash table
    Action<Person> insert = (person) => _table[hasher(person.Name)].Add(person);

    // calls the insert function/action for each person in the parameter array
    Array.ForEach(arr, insert);
}
4

5 に答える 5

5

初期化構文をサポートするコレクションを作成し、それをメソッドのパラメーターとして提供できます。これにより、次のことが可能になります。

void Main()
{
    SomeMethod(new PersonCollection{{1, 2}, {3, 4}, {5, 6}});
}
void SomeMethod(PersonCollection pc)
{
}

//...
class Person
{
    public Person(int a, int b)
    {
    }
}
class PersonCollection:IEnumerable
{
    IList<Person> personList = new List<Person>();
    public void Add(int a, int b)
    {
        personList.Add(new Person(a,b));
    }

    public IEnumerator GetEnumerator()
    {
        return personList.GetEnumerator();
    }
}

このような構成をサポートするために必要なのは、適切なvoid Addメソッドと の実装だけですIEnumerable

于 2013-05-06T10:25:28.310 に答える
1

C# では、クラスと構造体以外にグループ化する方法はありません。簡潔なコードの要求が常識を超えている場合は、「論理的な」方法を使用できます。次のようにメソッドを呼び出します。

Insert("John", "Doe", "Sherlock", "Holmes")

次のように処理します。

    void Insert(params string[] names)
    {
        if (names.Length % 2 != 0) throw new ArgumentException();

        for (int i = 0; i < names.Length; i += 2)
        {
            string name = names[i];

            string surname = names[i + 1];

            // use it
        }
    }
于 2013-05-06T10:23:58.163 に答える
1

見よ!モンスターを作りました!

次のようなコードを記述できます。

Insert(new People()["John", "Doe"]["Sherlock", "Holmes"]["Fred", "Flintsone"]);

でも本当に、それは忌まわしいことですよね?

using System;
using System.Collections.Generic;

namespace Demo
{
    class Program
    {
        static void Main()
        {
            new Program().test();
        }

        void test()
        {
            Insert(new People()["John", "Doe"]["Sherlock", "Holmes"]["Fred", "Flintsone"]);
        }

        public void Insert(params Person[] persons)
        {
            foreach (var person in persons)
            {
                Console.WriteLine(person);
            }
        }
    }

    public class People
    {
        public static implicit operator Person[](People people)
        {
            return people.people.ToArray();
        }

        public People this[string firstName, string lastName]
        {
            get
            {
                people.Add(new Person(firstName, lastName));
                return this;
            }
        }

        private readonly List<Person> people = new List<Person>();
    }

    public class Person
    {
        public Person(string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;
        }

        public override string ToString()
        {
            return FirstName + " " + LastName;
        }

        public readonly string FirstName, LastName;
    }
}
于 2013-05-06T11:02:31.100 に答える