0

Bloops のコレクションから作成された Razzies のコレクションがあります。Linq クエリを使用してこのコレクションを取得します。参照: Linq 特定のプロパティを別のオブジェクトに選択しますか? クエリのために。

for ループを使用せずに、コレクションを返す前、またはその直後に、新しく作成されたすべての Razzies に対してメソッドを実行できるかどうかを知りたいです。

私はこれを試しました:

Dim results = From item In bloops _
              Select New Razzie() With _
              { _
                  .FirstName = item.FirstName, _
                  .LastName = item.LastName _
              }.UpdateAddress(item.Address)

しかし、それは何も返しません。

4

5 に答える 5

2

ラス、これはあなたが望むことをするかもしれません。これは非常に単純なアプローチです。これがあなたの望むものでない場合は、質問を拡大してください。

これにより、列挙した各要素に対してメソッドが実行されます。列挙するまでメソッドは実行されませんが、データを使用する前にメソッド実行されることを安全に知ることができます。

EDITシールされたサードパーティ クラスを使用しているため、拡張メソッドを使用します。それが彼らの目的です。;) 拡張メソッドを使用するようにコードを修正しました。

class MyArgs { }
class Razzie //pretend this is a 3rd party class that we can't edit
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
static class RazzieExtensions
{
    public static Razzie MyMethod(this Razzie razzie, MyArgs args)
    {
        razzie.FirstName = razzie.FirstName.ToUpper();
        return razzie;
    }
}
class Program
{
    static void Main(string[] args)
    {
        var bloops = new List<Razzie>
            {
                new Razzie{FirstName = "name"},
                new Razzie{FirstName = "nAmE"}
            };
        var myArgs = new MyArgs();
        var results = from item in bloops
                      select new Razzie
                      {
                          FirstName = item.FirstName,
                          LastName = item.LastName
                      }.MyMethod(myArgs);

        foreach (var r in results)
            Console.WriteLine(r.FirstName);
        Console.ReadKey();
    }
}
于 2009-05-29T21:45:55.860 に答える
1

これを行う通常の方法は、最初の処理の後に foreach ループを使用することです。foreach ループを使用したくない場合は、この状況を処理する独自の拡張メソッドを定義する必要があります。

于 2009-05-29T21:31:27.403 に答える
0

なぜこれを通常の未解決の方法でやらないのですか? 拡張メソッドを使用して多くの凝ったことを行うことができます...しかし、拡張メソッドを使用して更新を実行することで、純粋性ルールを破る可能性があります...そして、物事を理解することも難しくなります. これを試して:

var results = from ... select new { Address = item.Address, Razzie = new Razzie { ... }}

foreach (var result in results)
{
    result.Razzie.UpdateAddress(result.Address);
}
于 2009-05-29T22:08:31.760 に答える
0

foreach ループを抽象化する場合は、次のように、List<T> の ConvertAll および ForEach メソッドを複製する IEnumerable<T> の拡張メソッドを記述します。

public static IEnumerable<TOutput> ConvertAll<T, TOutput>(this IEnumerable<T> collection, Converter<T, TOutput> converter)
{
    if (converter == null)
        throw new ArgumentNullException("converter");

    List<TOutput> list = new List<TOutput>();

    foreach (T item in collection)
    {
        list.Add(converter(item));
    }

    return list;
}

public static void ForEach<T>(this IEnumerable<T> collection, Action<T> action)
{
    foreach (T item in collection)
    {
        action(item);
    }
}

次に、次のように呼び出すことができます。

bloops
    .ConvertAll(bloop => new Razzie()
                            { 
                                FirstName = bloop.FirstName, 
                                Lastname = bloop.LastName 
                            })
    .ForEach(razzie => razzie.UpdateAddress());
于 2009-05-29T22:12:03.407 に答える
0

RunVoid の意味がわかりません。Void は、まだ結果を値に代入していないことを示唆しています。

RunVoid ですべてのアイテムに対してメソッドを実行し、元のコレクションを返しますか? その場合、組み込みメソッドはありませんが、そのように追加できます。

<Extension>
Public Function RunVoid(Of T)(source As IEnumerable(Of T), del As Action(Of T) As IEnumerable(Of T)
  For Each cur in source
    del(cur)
  Next
  return source
End Function
于 2009-05-29T21:25:50.380 に答える