有一个c#函数接受列表作为IEnumerable<T>
。我想在这个函数里面写一些linq查询,但是T
的属性似乎没有得到。
如何在写Linq语句之前将T映射到特定的类型?在本例中,它的类型为CustomerAddress
,具有3个属性Id, Name, Gender
。
private IEnumerable<IEnumerable<T>> SmartSplit<T>(IEnumerable<T> sourceList)
{
// not able to access any props of T; in this case T is of type CustomerAddress
int itemsCount = sourceList.Where(v => v.???==).Count();
}
我想获取itemsCount
作为长度为name>50在这个函数里。Linq会针对一个列表,比如
int itemsCount = sourceList.Where(p => p.Name.Length > 50).Count();
但是我怎么能访问SmartSplit
函数内的Name
属性?我可以看到有一种方法可以做到这一点,首先转换到一个列表,然后像下面这样写LINQ
private IEnumerable<IEnumerable<T>> SmartSplit<T>(IEnumerable<T> sourceList)
{
List<CustomerAddress> sourceListCopy = sourceList as List<CustomerAddress>;
int itemsCount= sourceListCopy.Where(p => p.Name.Length > 50).Count();
}
我们可以在不强制转换和复制到函数内部的临时列表的情况下做到这一点吗?
如果你想传递那里不仅仅是CustomerAddress,你应该提取你的共同属性到接口,然后使用约束'where'子句。
的例子:
public interface ICustomerInfo
{
string Name { get; set; }
}
private IEnumerable<IEnumerable<T>> SmartSplit<T>(IEnumerable<T> sourceList) where T: ICustomerInfo, class
{
int itemsCount = sourceList.Where(v => v.Name.Length > 50).Count();
return default;
}