2017-04-27 9 views
1

를 순환하는 대신 선택에 값을 복제 :LINQ 표현은 내가 폴더에 포함 된 파일에 대한 몇 가지 정보를 저장하는 클래스가 그들에게

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 
      }); 

이제 반환 된 구조는 폴더의 IEnumerable (예) 3 파일이됩니다.

이 시점까지 모든 것이 효과적입니다. 내가 선언 형식을 반환하려고하지

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이므로 변경 작업을 수행 할 수 없기 때문입니다.

+1

정적 수정자를 배경 필드에서 제거하여 보았습니까? – Peeyush

답변

1

files 클래스에는 정적 변수가 있습니다.

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

정적 클래스 멤버는 클래스의 모든 인스턴스에 대해 공유하는, 그래서 당신은 name="fielname"을 설정할 때 모든 인스턴스는 name 속성 "filename"를 반환합니다. 왜이 정적 필드가 필요한가요?

1

static- 수정 자에 대한 내용을 완전히 이해하지 못하는 것 같습니다. 간단히 말해 회원이 모두 클래스의 인스턴스에 속해있는 반면 비 정적 인 경우 클래스의 모든 인스턴스 (사용자가 new files()을 작성할 때마다)는 해당 멤버에 대해 고유 한 값을 갖습니다. 귀하의 경우 정적 결과는 귀하의 클래스의 모든 인스턴스에서 귀하의 fileList.Fl - 컬렉션의 마지막 반복에서 동일한 값을 가지고 있습니다. MSDN for static에 대한 자세한 내용을 볼 수도 있습니다.

이런 말을 해본 결과 static 수정자를 배경 필드에서 제거하여 해결할 수 있습니다.

이 외에도 naming-conventions에 대해 읽어야합니다. 클래스 이름은 files 대신에 Files 또는 더 나은 클래스로 작성됩니다. 실제로 모든 클래스 인스턴스가 단일 파일 파일을 나타내므로 File을 사용하면됩니다. 마찬가지로 fileList에서 FileList으로 이름을 변경하고 CamelCase의 모든 공용 회원에게 이름을 바꿉니다.

+0

우수 사례에 대한 포인터에 대해 감사드립니다. – user3247900