0

以下に示す出力を生成するには、次のコードに MySpecialFunction メソッドをどのように記述しますか? 最初の 3 つのプロパティをカンマ区切りのリストで表示し、残りの項目を数えて数値として報告したいと考えています。プロパティをラムダ式で指定したい。あなたの助けに感謝します!

public class MyObject
{
  public Text1 {get; set;}
  public Text2 {get; set;}

  public MyObject(string text1, string text2)
  {
    Text1 = text1;
    Text2 = text2;
  }
}

public class Main()
{
  List<MyObject> myObjects = new List<MyObject>();
  myObjects.Add(new MyObject("sample11", "sample12");
  myObjects.Add(new MyObject("sample21", "sample22");
  myObjects.Add(new MyObject("sample31", "sample32");
  myObjects.Add(new MyObject("sample41", "sample42");
  myObjects.Add(new MyObject("sample51", "sample52");

  MySpecialFunction(myObjects, f => f.Text1); 
  MySpecialFunction(myObjects, f => f.Text2);
}

出力文字列は次のとおりです。

sample11、sample21、sample31、その他 2 つ。

sample12、sample22、sample32、その他 2 つ。

ありがとう!

4

4 に答える 4

2

以下のコードのようなものを使用できます。

public class StackOverflow_14944788
{
    private static void MySpecialFunction(IEnumerable<MyObject> list, Func<MyObject, string> selector, int count = 3)
    {
        string result = string.Join(", ", list.Take(count).Select(selector));
        int listSize = list.Count();
        if (listSize > count)
        {
            result += ", and " + (listSize - count) + " more.";
        }

        Console.WriteLine(result);
    }

    public class MyObject
    {
        public string Text1 { get; set; }
        public string Text2 { get; set; }

        public MyObject(string text1, string text2)
        {
            Text1 = text1;
            Text2 = text2;
        }
    }

    public static void Test()
    {
        List<MyObject> myObjects = new List<MyObject>();
        myObjects.Add(new MyObject("sample11", "sample12"));
        myObjects.Add(new MyObject("sample21", "sample22"));
        myObjects.Add(new MyObject("sample31", "sample32"));
        myObjects.Add(new MyObject("sample41", "sample42"));
        myObjects.Add(new MyObject("sample51", "sample52"));

        MySpecialFunction(myObjects, f => f.Text1);
        MySpecialFunction(myObjects, f => f.Text2);
    }
}
于 2013-02-18T20:40:41.670 に答える
1

これは、例外を防ぎ、コレクション内のアイテムがmaxCountよりも少ない場合に安全に処理する汎用バージョンです。また、次の複数の列挙を回避しますinput

static string MySpecialFunction<T>(IEnumerable<T> input, Func<T, string> selector, int maxCount)
{
    if (input == null)
        throw new ArgumentNullException("input");

    if (selector == null)
        throw new ArgumentNullException("selector");

    if (maxCount <= 0)
        throw new ArgumentOutOfRangeException("maxCount must be greater than 0.");

    var items = input.Select(selector).ToArray();
    if (items.Length < 1)
    {
        return string.Empty;
    }
    else if (items.Length == 1)
    {
        return items[0];
    }
    else
    {
         var joined = String.Join(", ", items, 0, Math.Min(items.Length, maxCount));
         if (items.Length > maxCount)
         {
              joined += String.Format(", and {0} more.", items.Length - maxCount);
         }
         return joined;
    }
}

次のように使用します。

Console.WriteLine(MySpecialFunction(myObjects, o => o.Text1, 3));
于 2013-02-18T20:40:49.030 に答える
0

このようなもの(実行を参照):

static string MySpecialFunction(IEnumerable<string> items, int limit)
{
    var sb = new StringBuilder();

    bool delimit = false;
    int count = 0;

    foreach (var item in items) {
        if (limit == 0) {
            ++count;
        } else {
            if (delimit) {
                sb.Append(", ");
            }

            delimit = true;
            sb.Append(item);

            --limit;
        }
    }

    if (count != 0) {
        sb.Append(", and ");
        sb.Append(count);
        sb.Append(" more.");
    }

    return sb.ToString();
}

次に、次のように実行します。

var summary = MySpecialFunction(myObjects.Select(i => i.Text1), 3);
于 2013-02-18T20:36:08.773 に答える
0
private String MySpecialFunction<T>(IEnumerable<T> items, Func<T, String> selector)
{
    var prefix = items.Take(3).Select(selector);
    var suffix = " and " + (items.Count() - 3) +" more.";
    return prefix + suffix;
}
于 2013-02-18T20:39:46.990 に答える