10

fooCollection2回列挙せ​​ずにlinqでこれを行う方法はありますか?

var fooCollection = // get foo
var selectedIds = new List<int>();
var aggregateContent = String.Empty;

foreach (var f in foo)
{
    selectedIds.Add(foo.Id);
    aggregateContent += foo.Content
}

var results = new FooResults
{
    Content = aggregateContent,
    SelectedIds = selectedIds
};

return results;
4

5 に答える 5

2

1つの可能性がありますが、私はそれをハックだと考えています:

var aggregateContent = String.Empty;
var selectedIds = foo.Select(x => { aggregateContent += x.Content;
                                    return x.Id; })
                     .ToList();

私はあなたがすでに持っているループを使います。これは、思いつく LINQ ソリューションよりもはるかにクリーンです。

于 2012-10-17T14:30:18.800 に答える
1

あなたはこれを行うことができます:

foo.ForEach(x => { selectedIds.Add(x.Id); aggregateContent += x.Content; });

Content を文字列に連結するのではなく、StringBuilder代わりに a を使用することをお勧めします。

編集

ForEachforを実装する LINQ 拡張ライブラリがない場合IEnumerableは、次の方法を使用できます。

public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action) 
{ 
    foreach(T item in enumeration) 
    { 
        action(item); 
    } 
} 
于 2012-10-17T14:28:33.460 に答える
0

私も見つけられないので、このように自分で書きます

public static IEnumerable<V> SelectAggregate<T,V>(this IEnumerable<T> items,V seed,Func<V,T,V> func)
{
    foreach(var item in items)
    {
        seed    = func(seed,item);
        yield return seed;
    }
}


var array = new int[]{ 1,2,3 };
var sumArray = array.SelectAggregate(0,(seed,item) => seed + item).ToArray();
//// { 1,3,6 }
于 2018-07-25T03:15:58.917 に答える