2

タイプ Question のこの IEnumerable があります。クラス Question には、プロパティ Question(string) および Id(int) があります

私がやりたいのは、IEnumerable 内の任意のオブジェクトの質問の長さが 25 を超えている場合、それを「部分文字列」にして「...」を追加することです。

だから私の考えは次のようなものでした:

ienumQuestions.Where(e=>e.Question.Length > 25).Change(e.Question=>e.Question.Substring(25)+"...");

その構文が100%正しいかどうかはわかりませんが、要点を理解していただければ幸いです..

これを行う方法はありますか?..私は本当にこれのためにループを作成したくありません..私は単にループが好きではないので:)

前もって感謝します!

4

2 に答える 2

10

注意してアプローチする

ForEachLINQの有名な拡張メソッドを使用して、各アイテムを反復処理し、それに応じてアクションを実行できます。基本的に、これは説明した方法と同じであり、次のChangeようになります。

ForEachLINQ拡張メソッド

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

実装

ienumQuestions.Where(e => e.Question.Length > 25).ForEach(e =>
{
    e.Question = e.Question.Substring(0, 25) + "...";
});

// or
ienumQuestions.ForEach(e =>
{
    if (e.Question.Length > 25)
    {
        e.Question = e.Question.Substring(0, 25) + "...";
    }
});

議論と追加の読書

個人的には、ForEachLINQ拡張機能を使用してオブジェクトを直接更新する方法は嫌いです。参照目的でのみ使用することを好みます。ただし、採用する前に「foreach vs ForEach」を読むことを強くお勧めします。これは、コレクション内のオブジェクトを直接変更するという意味でLINQの原則に反するためです。これは、LINQが本来意図していないことです。

于 2012-06-11T09:37:30.120 に答える
0

ChangeLINQ には拡張機能はありません。両方IEnumerableともString(わずかに異なるレベルまで) 不変であるため、変更できません。

このような切り捨て拡張機能が必要だと思いますが、

IEnumerable<string> Truncate<T>(
    this IEnumerable<T> source,
    Func<T, string> stringAccessor,
    int length,
    string suffix)
{
    var strings = source.Select(stringAccesor);
    return strings.Select(s =>
        {
            if (s.Length < length)
            {
                return s;
            }

            return string.Format(
                "{0}{1}",
                s.SubString(0, length),
                suffix)
        });
}

あなたはこのように呼び出すことができます

var truncatedQuestions = ienumQuestions.Truncate(q => q.Question, 25, "...");
于 2012-06-11T09:55:54.383 に答える