シーケンスのすべての値が同じかどうかを確認する拡張メソッドをまとめようとしています。その値がintであればその値の平均値を返し、文字列であればその値の連結を返します。例えばC#LINQシーケンスが同じかどうかをチェックして値を返します
は、私はこの
itemsTheSame.AllEqual(item => item.Size)); // should return 1 as an int
itemsTheSame.AllEqual(item => item.Name)); // should return "Red" as a string
私のジェネリック医薬品は非常に強力ではないですが、これはIVEが開始するものであるような何かを行うことができるようにしたい、次のオブジェクトとリスト
public class Item
{
public int Size {get; set;}
public string Name {get; set;}
}
var itemsTheSame = new List<Item>
{
new Item { Size = 1, Name = "Red" },
new Item { Size = 1, Name = "Red" },
new Item { Size = 1, Name = "Red" }
};
を取りますoffで返す
public static class Extensions
{
public static int AllEqual<TSource>(this IEnumerable<TSource> list, Func<TSource, int> selector)
{
if (!list.Any()) return default(int);
var first = list.First();
return list.Skip(1).All(selector == first) ? default(int) : default(int);
}
}
戻り値の型は汎用のaswである必要がありますエル、そう
public static TReturn AllEqual<TSource, TReturn>(this IEnumerable<TSource> list, Func<TSource, TReturn> selector)
{
if (!list.Any()) return default(TReturn);
var first = list.First(selector);
return list.Skip(1).All(selector == first) ? default(TReturn) : default(TReturn);
}
私は値そのものを取得することができるように.First()
にFunc<TSource, TReturn> selector
に合格できるようにする必要があるとして、完全に混乱していますが、.First
はFunc<TSource, bool>
を必要とする。この(doesentコンパイル)を思い付きました。私はまた、セレクタで指定されたフィールドが等しいかどうかをチェックしたいので、同じセレクタを.All
に渡す必要があります。
オーバーロードされたメソッド、intを返すメソッド、文字列などを返すメソッドのセットを持つ方が良いでしょうか?
フィドルhere
これはちょっと混乱しているようです。例えば"レッド"の平均は何ですか? – stuartd
あなたのメソッドのシグネチャは 'public static TSource AllEqual ...' –
Rahul
です。@stuartd TSourceはtypeof(string)と見なされますが、このシナリオでは別個の値の連結を返すことを望みます。 –