|
that's brilliant! Thank you!
I did get half way as I edited my code to
MainFileTable.Add(new Filelist(@"G:\Jammer\", "2132987", ".WAV", "12/12/2007"));
just one question, how did you format the code in the reply ... ?
|
|
|
|
|
Jammer wrote: how did you format the code in the reply
I used the html preformat tag around the code.
<pre>Your code here</pre>
Sounds like somebody's got a case of the Mondays
-Jeff
|
|
|
|
|
|
Hi Jeff,
I've just amended my code and I have a slight problem I can't figure out.
<code> public class BuildFileList
{
public struct Filelist
{
public string file_name, file_size, file_ext, last_access;
public FileList(string fileName, string fileSize, string fileExt, string lastAccess)
{
file_name = fileName;
file_size = fileSize;
file_ext = fileExt;
last_access = lastAccess;
}
}
public static void main()
{
List<filelist> MainFileTable = new List<filelist>();
MainFileTable.Add(new Filelist(@"G:\Jammer\", "2132987KB", ".WAV", "12/12/2007"));</filelist></filelist></code>
The compile error is on FileList - method must have a return type but adding 'void' to the constructor generates another error
"Error 1 'SampleSort.DataLayer.BuildFileList.Filelist' does not contain a constructor that takes '4' arguments F:\VS2008Stuff\JamSoft.SampleSort\SampleSort.DataLayer\BuildFileList.cs 29 31 SampleSort.DataLayer"
I'm sure its dead simple but I've run out of things to try ... TIA.
|
|
|
|
|
I've moved the struct outside of the BuildFilList class and i'm still having the same the problem. any pointers would be great.
|
|
|
|
|
ok, i've fixed it now! Case sensitivity on the constructor being different to the struct name ...
|
|
|
|
|
Spoke too soon! I promise i'm going to go away soon ... I'm getting "The name 'MainFileTable' does not exist in the current context" on the AddRecordToFileTable() method ... why would this be out of context considering that its instantiated inside a public method main()? Am I trying to do too many things in one class? How do I go about 'positioning' the MainFileTable to make it globally accessible to other methods and so on?
namespace SampleSort.DataLayer
{
public class BuildFileList
{
public struct Filelist
{
public string file_name, file_size, file_ext, last_access;
public Filelist(string fileName, string fileSize, string fileExt, string lastAccess)
{
file_name = fileName;
file_size = fileSize;
file_ext = fileExt;
last_access = lastAccess;
}
}
public static void main()
{
List<filelist> MainFileTable = new List<filelist>();
MainFileTable.Add(new Filelist(@"G:\Jammer\", "2132987KB", ".WAV", "12/12/2007"));
DirectoryInfo dir = new DirectoryInfo(@"G:\samples\ACID-Groove Clips\Loopmasters\DnB Producer\Basslines WAV\Basslines 160bpm WAV");
getDirsFiles(dir);
}
public static void getDirsFiles(DirectoryInfo d)
{
FileInfo[] files;
files = d.GetFiles("*.*");
foreach(FileInfo file in files)
{
string fileName = file.FullName;
string fileSize = file.Length.ToString();
string fileExt = file.Extension;
string fileCreated = file.LastWriteTime.ToString();
AddRecordToFileTable(fileName, fileSize, fileExt, fileCreated);
}
DirectoryInfo [] dirs = d.GetDirectories("*.*");
foreach (DirectoryInfo dir in dirs)
{
getDirsFiles(dir);
}
}
public static void AddRecordToFileTable(string f1, string f2, string f3, string f4)
{
MainFileTable.Add(new Filelist(f1, f2, f3, f4));
}
}
}</filelist></filelist>
|
|
|
|
|
Eventually I have to bind this MainFileTabe to a DataGrid in the SampleSort.Presentation namespace ... should I be creating this generic list in that namespace and merely accessing it from this DataLayer?
very confused at the moment ... you can probably tell!
|
|
|
|
|
Ideally, your presentation layer will not create data sources, it will simply call methods that return them, and then bind to them from there.
Christian Graus - Microsoft MVP - C++
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
Jammer wrote: public static void main() { List MainFileTable = new List(); MainFileTable.Add(new Filelist(@"G:\Jammer\", "2132987KB", ".WAV", "12/12/2007")); DirectoryInfo dir = new DirectoryInfo(@"G:\samples\ACID-Groove Clips\Loopmasters\DnB Producer\Basslines WAV\Basslines 160bpm WAV"); getDirsFiles(dir); }
This variable (MainFileTable) is not global, it's visible only inside the Main method, unless you pass it around from there.
Christian Graus - Microsoft MVP - C++
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
Of course!!! <slaps forehead>
Seems obvious now, I'm really struggling getting away from thinking about these repositories of data in terms other than database tables and so on.
I really just need to encapsulate the creation of that generic list into its own method that simply returns it to whatever called it. ie: the class that is going to do something with it ...
Thanks Christian.
|
|
|
|
|
I'm starting to realise that I may need to complete restructure my code. I've spent too long only working in VFP!
Thanks again Christian.
|
|
|
|
|
An overload is where a derived class impliments a method from the base class, thus 'overloading' it with a new implimentation.
As someone else said, you need to put a new Filelist in there, not four strings. The easiest way is to create a constructor, so you can do this:
MainFileTable.Add(new Filelist(@"G:\Jammer\", "2132987", ".WAV", "12/12/2007"));
That won't work without a defined constructor that takes four strings.
Also, why not store your date as a datetime ? It allows for all sorts of comparison operations later.
Christian Graus - Microsoft MVP - C++
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
gotcha ... indeed, I'm going to store the dates as datetimes i'm just trying to get a grip on the generics at the moment. You make a v. good point.
|
|
|
|
|
Jammer wrote: Can a generic list hold multiple fields? Somethihing akin to a datatable like, a few strings, an int a couple of bools ... ??
A Generic List can contain items of any 1 particular type. Define a class that exposes properties representing whatever data items you want to store and you can store instances of this class in your generic list.
Paul Marfleet
"No, his mind is not for rent
To any God or government"
Tom Sawyer - Rush
|
|
|
|
|
Gotcha, so I'm barking up the wrong tree at the moment.
I'm still stuck in database mode when I think of storing data. So if I wanted to achieve the storage of the data I listed I would have to store each value type in a separate generic list. One with strings, one with ints and one with bools ... liked with key values?
so each list would be something like:
key(of type int), string, string, string
key(of type int), int, int, int
key(of type int, bool, bool, bool
and its the keys that bring those items of data back together again?
I'm basically wanting to store a list of files with all manner of information about them and allow a user to query that data ...
|
|
|
|
|
If you store your data in a class, then you can build dictionarys that map keys to class instances, and they will be references to the same class instances in your main list. If you had a numeric value to search, so there could be more than one result, you could do a dictionary mapping int to list of myClass.
Christian Graus - Microsoft MVP - C++
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
whoa ... that really has gone right over my head!!!
|
|
|
|
|
A dictionary/hashtable is a container with two types, and instead of storing a sequential list you can look up with just an index, it associates one value with another. So, as dictionary<string, string> may have a key of "fish" and a value against that key of "eyes". You do that with myHash["fish"] = "eyes"; and you can look up the value with string thisStringWillBeEyes = myHash["fish"]
So, you can use any type as a key to look up any other type.
Christian Graus - Microsoft MVP - C++
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
Ahhhhh ... this is all making sense now ... i think!
|
|
|
|
|
Christian Graus wrote: If you store your data in a class, then
led mike
|
|
|
|
|
The generic List<t> takes one type parameter. This means you can only make a list of one type.
{string, string...}
or, like you said: {struct, struct... } - which effectively makes it a list of anything.
If you are thinking of data - don't forget the Dictionary<tkey,tvalue> which lets you have an indexer.
Edit: Whoa, real deja vu on the question...
|
|
|
|
|
Gotcha ... thanks for that mark ... where's the de ja vu come from?
|
|
|
|
|
Ah i swear i've seen this question before with almost identical wording. I had a google and I mustve been wrong :P
|
|
|
|
|
ahhhh ... i know that my head is spinning with code at the moment! de ja vu aplenty!
|
|
|
|