【发布时间】:2016-06-21 17:01:11
【问题描述】:
我正在尝试组合一个扩展方法,该方法允许我检查序列的所有值是否相同,如果是则返回该值,或者如果它是 int 或 double 则不返回该值的平均值如果是字符串,则返回该值的串联。
例如下面的对象和一个列表
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" }
};
我希望能够做这样的事情
itemsTheSame.AllEqual(item => item.Size)); // should return 1 as an int
itemsTheSame.AllEqual(item => item.Name)); // should return "Red" as a string
我的泛型不是很强大,但这是我开始的
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);
}
}
对我来说很明显返回类型也需要是通用的,所以想出了这个(不编译)
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);
}
我完全糊涂了,因为我需要能够将Func<TSource, TReturn> selector 传递给.First() 才能获得值本身,但.First 需要Func<TSource, bool>。我还需要能够将相同的选择器传递给.All,因为我只想检查选择器中指定的字段是否相等。
这是否可能,或者我最好拥有一组重载方法,一个返回一个 int,另一个返回一个字符串等?
小提琴here
【问题讨论】:
-
这听起来有点混乱。例如“红色”的平均值是多少?
-
你的方法签名可以是
public static TSource AllEqual<TSource>... -
@stuartd 在这种情况下看到 TSource 将是 typeof(string) 我希望它返回不同值的串联。