Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何返回只读IEnumerable<;T>;而不是列表<;T>;_C#_Asp.net_Ienumerable - Fatal编程技术网

C# 如何返回只读IEnumerable<;T>;而不是列表<;T>;

C# 如何返回只读IEnumerable<;T>;而不是列表<;T>;,c#,asp.net,ienumerable,C#,Asp.net,Ienumerable,我想在我的代码中集成ienumerable,使其成为只读的,但我不知道在哪里可能实现它。到目前为止,我还没有在互联网上找到任何可能解决我问题的方法。到目前为止,我只使用了List,希望在代码中集成ienumerable。此外,如果您注意到糟糕的编码实践,请随时提出建议 代码如下: public static List<GuitarItems> GetGuitarItems(string itemCategory) { List<GuitarItems> list

我想在我的代码中集成ienumerable,使其成为只读的,但我不知道在哪里可能实现它。到目前为止,我还没有在互联网上找到任何可能解决我问题的方法。到目前为止,我只使用了List,希望在代码中集成ienumerable。此外,如果您注意到糟糕的编码实践,请随时提出建议

代码如下:

public static List<GuitarItems> GetGuitarItems(string itemCategory)
{
    List<GuitarItems> list = new List<GuitarItems>();
    string query = string.Format("SELECT * FROM guitarItems WHERE brand LIKE @brand");

    try
    {
        conn1.Open();
        command1.CommandText = query;
        command1.Parameters.Add(new SqlParameter("brand", itemCategory));
        SqlDataReader reader = command1.ExecuteReader();

        while (reader.Read())
        {
            int id = reader.GetInt32(0);
            string type = reader.GetString(1);
            string brand = reader.GetString(2);
            string model = reader.GetString(3);
            double price = reader.GetDouble(4);
            string itemimage1 = reader.GetString(5);
            string itemimage2 = reader.GetString(6);
            string description = reader.GetString(7);
            string necktype = reader.GetString(8);
            string body = reader.GetString(9);
            string fretboard = reader.GetString(10);
            string fret = reader.GetString(11);
            string bridge = reader.GetString(12);
            string neckpickup = reader.GetString(13);
            string bridgepickup = reader.GetString(14);
            string hardwarecolor = reader.GetString(15);

            GuitarItems gItems = new GuitarItems(id, type, brand, model, price, itemimage1, itemimage2, description, necktype, body,
                fretboard, fret, bridge, neckpickup, bridgepickup, hardwarecolor);
            list.Add(gItems);
        }
    }
    finally
    {
        conn1.Close();
        command1.Parameters.Clear();
    }

    return list;
}
publicstaticlist GetGuitarItems(stringitemcegory)
{
列表=新列表();
string query=string.Format(“从吉他中选择*,其中品牌类似@brand”);
尝试
{
conn1.Open();
command1.CommandText=查询;
command1.Parameters.Add(新的SqlParameter(“brand”,itemcegory));
SqlDataReader=command1.ExecuteReader();
while(reader.Read())
{
int id=reader.GetInt32(0);
字符串类型=reader.GetString(1);
string brand=reader.GetString(2);
字符串模型=reader.GetString(3);
double price=reader.GetDouble(4);
string itemimage1=reader.GetString(5);
string itemimage2=reader.GetString(6);
字符串描述=reader.GetString(7);
string necktype=reader.GetString(8);
字符串体=reader.GetString(9);
string-fretboard=reader.GetString(10);
string fret=reader.GetString(11);
stringbridge=reader.GetString(12);
string=reader.GetString(13);
string bridgepick=reader.GetString(14);
字符串hardwarecolor=reader.GetString(15);
GuitarItems gItems=新吉他(id、类型、品牌、型号、价格、itemimage1、itemimage2、说明、颈型、主体、,
fretboard、fret、桥接器、颈部拾音器、桥接拾音器、硬件颜色);
列表.添加(gItems);
}
}
最后
{
conn1.Close();
command1.Parameters.Clear();
}
退货清单;
}
下面是另一个代码:

private void FillPage()
{
    List<GuitarItems> itemList = new List<GuitarItems>();
    List<string> itemListPage = new List<string>();

    itemList = ConnectionClassGuitarItems.GetGuitarItems(brandType);

    StringBuilder sb = new StringBuilder();

    foreach (GuitarItems gList in itemList)
    {
        itemListPage.Add("GuitarItemsIbanezDetails" + (x + 1) + ".aspx");

        sb.Append(
                string.Format(
                    @"
                    <div class='one-two'>
                        <a href='{3}' runat="'server'"><img runat="'server'" src='{0}'/></a>
                        <div class='content'>
                            <div id='label'>{1} {2}</div>
                        </div>

                </div>", gList.ItemImage1, gList.Brand, gList.Model, itemListPage[x]));

        x++;

    }


    lblOutput.Text = sb.ToString();

}
private void FillPage()
{
List itemList=新列表();
List itemListPage=新列表();
itemList=ConnectionClassGuitariems.GetGuitariems(brandType);
StringBuilder sb=新的StringBuilder();
foreach(项目列表中的吉他声闪烁)
{
添加(“GuitarItemsIbanezDetails”+(x+1)+“.aspx”);
附加(
字符串格式(
@"
{1} {2}
“,gList.itemage1,gList.Brand,gList.Model,itemListPage[x]);
x++;
}
lblOutput.Text=sb.ToString();
}

您想要实现什么


List
它已经是一个
IEnumerable
了,因为它实现了
IEnumerable
接口,所以你可以像对待
IEnumerable
一样对待你的
List
,比如在方法参数中。

你想要实现什么

List
它已经是一个
IEnumerable
,因为它实现了
IEnumerable
接口,所以你可以像对待
IEnumerable
一样对待你的
List
,比如在方法参数中。

从技术上讲,List
是一个
IEnumerable
,但我理解你的意思。如果返回
列表
,则该列表可能会被修改。您希望返回可以在没有任何人修改其内容的情况下传递的内容

有两件事可以做到这一点。第一个可能就是你所需要的

首先,改变这个

public static List<GuitarItems> GetGuitarItems(string itemCategory)
为此:

return list.AsReadOnly();
结果是,现在您不会返回一个转换为
IReadOnlyList
列表
AsReadOnly()
创建一个新集合,即
ReadOnlyCollection
并将其强制转换为
IReadOnlyList
。现在,返回的类型不仅表明列表不能修改,而且确实不能修改,因为它是只读集合

查看它的一个好方法是,方法的返回值应该指示您希望消费者对它做什么。如果您希望他们收到不应修改的列表,请返回
IReadOnlyList


一个相关的问题是,您应该返回
IEnumerable
还是
IReadOnlyList
IEnumerable
更一般,也不表示可以更改的列表。你会发现它的使用频率要高得多。不同之处在于,
IEnumerable
可以表示执行的查询。如果要枚举的项被多次枚举,则可能导致多次执行查询

在上面的示例中,如果将
列表
更改为
IEnumerable
,则仍然返回一个
列表
,因此多次枚举该列表不会重复执行查询。但是现在拥有
IEnumerable
的消费者不可能知道这一点,因此他们会想这样做:

var items = GetGuitarItems("category").ToList();
确保查询执行一次并放入一个列表中,他们可以根据需要多次枚举该列表

返回
IReadOnlyList
让他们知道他们拥有的肯定是一个列表,而不是每次枚举时都会被查询到的东西

如果您使用Resharper,这一点会变得很明显。如果您有一个
IEnumerable
,并且多次枚举它,它将警告您。该项可能实际上是一个列表或数组,但您不知道这一点

从技术上讲,
列表是一个
IEnumerable
,但我理解你的意思。如果返回
列表
,则该列表可能会被修改。您希望返回可以在没有任何人修改其内容的情况下传递的内容

有两件事可以做到这一点。第一个可能就是你所需要的

F
return list;
return list.AsReadOnly();
var items = GetGuitarItems("category").ToList();