LINQ表达式在select上复制值而不是循环它们

时间:2017-04-27 06:34:07

标签: c# linq class datagrid anonymous-types

我有一个类来存储有关文件夹中包含的文件的一些信息:

static class fileList
{
    public static IEnumerable<files> fL;
}

public class files
{
    private static string _name = "";
    private static long _size;
    private static DateTime _creationDate;

    public string name
    {
        get { return _name; }
        set { _name = value; }
    }

    public long size
    {
        get { return _size; }
        set { _size = value; }
    }

    public DateTime creationDate
    {
        get { return _creationDate; }
        set { _creationDate = value; }
    }
}

然后通过以下方式填充文件列表:

fileList.fL = Directory.EnumerateFiles(folder, "*.*", SearchOption.AllDirectories)
            .Select(x => new 
            {
                name = x.ToString(),
                size = new FileInfo(x).Length,
                creationDate = new FileInfo(x).CreationTime
            });

现在返回的结构将是文件夹中(例子)3个文件的IEnumerable。

到目前为止一切正常。当我尝试返回声明的类型而不是匿名的

时,问题就会出现
var fL = Directory.EnumerateFiles(folder, "*.*", SearchOption.AllDirectories);
        fileList.fL = fL.Select(x => new files()
            {
                name = x.ToString(),
                size = new FileInfo(x).Length,
                creationDate = new FileInfo(x).CreationTime
            });

这将返回3个IEnumberable项,但所有项都包含完全相同的信息。到目前为止,我看到的是EnumerateFiles方法返回的最后一个文件条目。

我想返回一个类型的原因是因为这些信息将进入DataGridView,如果数据源是匿名类型,则由于类型为ReadOnly,将无法执行任何更改。

2 个答案:

答案 0 :(得分:1)

您的files班级中有静态变量。

private static string _name = "";
private static long _size;
private static DateTime _creationDate;

静态类成员是为该类的所有实例共享的,因此在设置name="fielname"时,所有实例都将为"filename"属性返回name。为什么需要这个静态字段?

答案 1 :(得分:1)

你似乎没有完全理解static - 修饰符的含义。简而言之,当成员属于类的所有实例时使用它,而非静态意味着类的每个实例(无论何时写new files())都有自己的值会员。在您的情况下,静态会导致您的类的所有实例具有相同的值,即fileList.Fl - 集合的最后一次迭代中的值。您还可以进一步了解MSDN for static

说完这个问题后,您可以通过删除后备字段中的static - 修饰符来解决您的问题。

除此之外,您应该阅读naming-conventions,例如使用CamelCase编写的类名 - 例如类Files而不是files甚至更好 - 因为实际上每个类的实例代表一个文件,只需使用{{ 1}}。类似地将File重命名为fileList,并将所有公共成员重命名为CamelCase。