LINQ 表达式复制 select 上的值而不是循环它们
LINQ expression duplicates values on select instead of cycling them
我有一个 class 来存储有关文件夹中包含的文件的一些信息:
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
});
现在 returned 结构将是文件夹中(示例)3 个文件的 IEnumerable。
到目前为止一切正常。当我尝试 return 声明类型而不是匿名类型时出现问题
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
});
这将 return 3 IEnumerable
个项目,但所有项目都包含完全相同的信息。据我所知,这是 return 由 EnumerateFiles
方法编辑的最后一个文件条目。
我想 return 类型的原因是因为这些信息随后将进入 DataGridView,如果数据源是匿名类型,则无法执行任何更改,因为类型是只读的。
您的 files
class.
中有静态变量
private static string _name = "";
private static long _size;
private static DateTime _creationDate;
静态 class 成员为 class 的所有实例共享,因此当您设置 name="fielname"
时,所有实例都会 return "filename"
name
属性。为什么需要这个静态字段?
您似乎没有完全理解 static
修饰符的含义。简而言之,当成员属于 class 的 all 个实例时使用它,而非静态意味着 class 的每个实例(无论何时写 new files()
) 对成员有自己的值。在您的情况下,静态结果在您的 class 的所有实例中具有相同的值,这些值来自您的 fileList.Fl
集合的最后一次迭代。您还可以进一步查看 MSDN for static
.
话虽如此,您的问题已通过从您的支持字段中删除 static
-修饰符来解决,正如其他人已经提到的那样。
除此之外,您还应该阅读 naming-conventions,例如class-名称以 CamelCase 书写 - 例如 class Files
而不是 files
甚至更好 - 因为实际上 class 的每个实例都代表 一个个文件,只需使用File
。类似地,将 fileList
重命名为 FileList
,并将所有 public 成员也重命名为 CamelCase。
我有一个 class 来存储有关文件夹中包含的文件的一些信息:
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
});
现在 returned 结构将是文件夹中(示例)3 个文件的 IEnumerable。
到目前为止一切正常。当我尝试 return 声明类型而不是匿名类型时出现问题
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
});
这将 return 3 IEnumerable
个项目,但所有项目都包含完全相同的信息。据我所知,这是 return 由 EnumerateFiles
方法编辑的最后一个文件条目。
我想 return 类型的原因是因为这些信息随后将进入 DataGridView,如果数据源是匿名类型,则无法执行任何更改,因为类型是只读的。
您的 files
class.
private static string _name = "";
private static long _size;
private static DateTime _creationDate;
静态 class 成员为 class 的所有实例共享,因此当您设置 name="fielname"
时,所有实例都会 return "filename"
name
属性。为什么需要这个静态字段?
您似乎没有完全理解 static
修饰符的含义。简而言之,当成员属于 class 的 all 个实例时使用它,而非静态意味着 class 的每个实例(无论何时写 new files()
) 对成员有自己的值。在您的情况下,静态结果在您的 class 的所有实例中具有相同的值,这些值来自您的 fileList.Fl
集合的最后一次迭代。您还可以进一步查看 MSDN for static
.
话虽如此,您的问题已通过从您的支持字段中删除 static
-修饰符来解决,正如其他人已经提到的那样。
除此之外,您还应该阅读 naming-conventions,例如class-名称以 CamelCase 书写 - 例如 class Files
而不是 files
甚至更好 - 因为实际上 class 的每个实例都代表 一个个文件,只需使用File
。类似地,将 fileList
重命名为 FileList
,并将所有 public 成员也重命名为 CamelCase。