关于IEnumerable 、Ilist与List

时间:2022-09-10 23:52:55
下面代码中既出现了IEnumerable<T>,又出现了Ilist<T>和List<T>,这三者有什么区别和不同意义呢?是不是也能用var?
public IList<Product> GetProducts(string productName, ProductCategory category)
        {
            IEnumerable<Product> query;
            
            int categoryId = category.ProductCategoryID;
            if (!String.IsNullOrEmpty(productName))
            {
                query = from p in context.Products.Expand("ProductCategory")
                        where p.ProductCategory.ProductCategoryID == categoryId && p.Name == productName
                        select p;
            }


            try
            {
                List<Product> productSet = query.ToList();
                return productSet;
            }catch(Exception)
            {
                return null;
            }
        }

4 个解决方案

#1


 List<T> : IList<T>, ICollection<T>, IEnumerable<T>
 IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

#2


不太明白啊,还望前辈解释下啊!
引用 1 楼  的回复:
 List<T> : IList<T>, ICollection<T>, IEnumerable<T>
 IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

#3


List<T>  <  IList<T>  <   IEnumerable<T>

子类的值可以直接赋给父类(隐试转换)

#4




var
Visual Studio 2012 - Visual C#
var(C# 参考)

从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型 var。 隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。 下面的两个 i 声明在功能上是等效的:

var i = 10; // implicitly typed
int i = 10; //explicitly typed

有关更多信息,请参见 隐式类型的局部变量(C# 编程指南) 和 LINQ 查询操作中的类型关系 (C#) 。
示例

下面的示例演示了两个查询表达式。 在第一个表达式中,允许但不需要使用 var,因为可以将查询结果的类型显式声明为 IEnumerable<string>。 但是,在第二个表达式中必须使用 var,因为结果是一个匿名类型集合,而该类型的名称只有编译器本身可以访问。 请注意,在第二个示例中,foreach 迭代变量 item 也必须转换为隐式类型。

    // Example #1: var is optional because
    // the select clause specifies a string
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;
     
    // Because each element in the sequence is a string, 
    // not an anonymous type, var is optional here also.
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }
     
    // Example #2: var is required because
    // the select clause specifies an anonymous type
    var custQuery = from cust in customers
                    where cust.City == "Phoenix"
                    select new { cust.Name, cust.Phone };
     
    // var must be used because each item 
    // in the sequence is an anonymous type
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }
     

请参见
参考
隐式类型的局部变量(C# 编程指南)
概念
C# 编程指南
其他资源
C# 参考


#1


 List<T> : IList<T>, ICollection<T>, IEnumerable<T>
 IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

#2


不太明白啊,还望前辈解释下啊!
引用 1 楼  的回复:
 List<T> : IList<T>, ICollection<T>, IEnumerable<T>
 IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

#3


List<T>  <  IList<T>  <   IEnumerable<T>

子类的值可以直接赋给父类(隐试转换)

#4




var
Visual Studio 2012 - Visual C#
var(C# 参考)

从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型 var。 隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。 下面的两个 i 声明在功能上是等效的:

var i = 10; // implicitly typed
int i = 10; //explicitly typed

有关更多信息,请参见 隐式类型的局部变量(C# 编程指南) 和 LINQ 查询操作中的类型关系 (C#) 。
示例

下面的示例演示了两个查询表达式。 在第一个表达式中,允许但不需要使用 var,因为可以将查询结果的类型显式声明为 IEnumerable<string>。 但是,在第二个表达式中必须使用 var,因为结果是一个匿名类型集合,而该类型的名称只有编译器本身可以访问。 请注意,在第二个示例中,foreach 迭代变量 item 也必须转换为隐式类型。

    // Example #1: var is optional because
    // the select clause specifies a string
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;
     
    // Because each element in the sequence is a string, 
    // not an anonymous type, var is optional here also.
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }
     
    // Example #2: var is required because
    // the select clause specifies an anonymous type
    var custQuery = from cust in customers
                    where cust.City == "Phoenix"
                    select new { cust.Name, cust.Phone };
     
    // var must be used because each item 
    // in the sequence is an anonymous type
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }
     

请参见
参考
隐式类型的局部变量(C# 编程指南)
概念
C# 编程指南
其他资源
C# 参考


相关文章