web-dev-qa-db-ja.com

C#構文-ラムダ式の例-汎用リスト上のForEach()

最初に、フレームワークに既に_List<>_クラスを反復処理する汎用_List<>_クラスのメソッドがあることを知っています。

しかし、例として、ForEachメソッドを記述して_List<>_の各オブジェクトを反復処理し、各オブジェクトでConsole.WriteLine(object.ToString())を実行する正しい構文は何ですか。 _List<>_を最初の引数として、ラムダ式を2番目の引数としてとる何か。

私が見た例のほとんどは、拡張メソッドとして実行されるか、LINQに関係します。昔ながらの方法の例を探しています。

35
BuddyJoe
public void Each<T>(IEnumerable<T> items, Action<T> action)
{
    foreach (var item in items)
        action(item);
}

...そして、このように呼び出します:

Each(myList, i => Console.WriteLine(i));
59
Matt Hamilton

上記は、次のように少ないコードで記述できます。

new List<SomeType>(items).ForEach(
    i => Console.WriteLine(i)
);

これにより、汎用リストが作成され、IEnumerableが設定されてから、リストオブジェクトForEachが呼び出されます。

34
Peanut

これはあなたが求めているものですか?

int[] numbers = { 1, 2, 3 };
numbers.ToList().ForEach(n => Console.WriteLine(n));
28
Mauro Torres
public static void Each<T>(this IEnumerable<T> items, Action<T> action) {
foreach (var item in items) {
    action(item);
} }

...そして、このように呼び出します:

myList.Each(x => { x.Enabled = false; });
12

拡張メソッドはインスタンスメソッドを呼び出すためのクールな方法であるため、誰かが拡張メソッドとして答えを提供しても心配する必要はあまりないことを伝えたいと思います。拡張メソッドを使用せずに答えを求めていることを理解しています。メソッドが静的、インスタンス、または拡張として定義されているかどうかに関係なく、結果は同じです。

以下のコードは、受け入れられた回答のコードを使用して拡張メソッドとインスタンスメソッドを定義し、出力が同じであることを示す単体テストを作成します。

public static class Extensions
{
    public static void Each<T>(this IEnumerable<T> items, Action<T> action)
    {
        foreach (var item in items)
        {
            action(item);
        }
    }
}

[TestFixture]
public class ForEachTests
{
    public void Each<T>(IEnumerable<T> items, Action<T> action)
    {
        foreach (var item in items)
        {
            action(item);
        }
    }

    private string _extensionOutput;

    private void SaveExtensionOutput(string value)
    {
        _extensionOutput += value;
    }

    private string _instanceOutput;

    private void SaveInstanceOutput(string value)
    {
        _instanceOutput += value;
    }

    [Test]
    public void Test1()
    {
        string[] teams = new string[] {"cowboys", "falcons", "browns", "chargers", "rams", "seahawks", "lions", "heat", "blackhawks", "penguins", "pirates"};

        Each(teams, SaveInstanceOutput);

        teams.Each(SaveExtensionOutput);

        Assert.AreEqual(_extensionOutput, _instanceOutput);
    }
}

文字通り、拡張メソッドをインスタンスメソッドに変換するために必要なことは、static修飾子とメソッドの最初のパラメーターを削除することだけです。

この方法

public static void Each<T>(this IEnumerable<T> items, Action<T> action)
{
    foreach (var item in items)
    {
        action(item);
    }
 }

になる

public void Each<T>(Action<T> action)
{
    foreach (var item in items)
    {
        action(item);
    }
 }
2
Ryan Rodemoyer

リスト内の各文字列をトラバースでき、単一のステートメントを使用してジェネリック全体を検索することもでき、これにより検索が容易になります。

public static void main(string[] args)
{
List names = new List();

names.Add(“Saurabh”);
names.Add("Garima");
names.Add(“Vivek”);
names.Add(“Sandeep”);

string stringResult = names.Find( name => name.Equals(“Garima”));
}
0
Saurabh Singh