我有一个数组中的多个对象格式:
id_name_date_filetype。
我需要使用所有对象,让我们说相同的id或相同的名称,并将它们插入一个新的数组。使用GetFiles
方法我已经将所有对象放在一个数组中并且我有他们的名字,但我不知道如何区分它们。
我有一个foreach
我将通过所有的对象,但我有点卡住了。关于我该怎么办的任何提示?
//Process the files
string[] filelist = Directory.GetFiles(SourceDirectory, "*.tsv*", SearchOption.TopDirectoryOnly).Select(filename => Path.GetFullPath(filename)).Distinct().ToArray();
foreach (string file in filelist)
{
string[] fileNameSplit = file.Split('_');
switch (fileNameSplit.Last().ToLower())
{
case "assets.tsv":
assets = ReadDataFromCsv<Asset>(file);
break;
case "financialaccounts.tsv":
financialAccounts = ReadDataFromCsv<FinancialAccount>(file);
break;
case "households.tsv":
households = ReadDataFromCsv<Household>(file);
break;
case "registrations.tsv":
registrations = ReadDataFromCsv<Registration>(file);
break;
case "representatives.tsv":
representatives = ReadDataFromCsv<Representative>(file);
break;
}
}
// Find all files from one firm and insert them in a list
foreach (string file in filelist)
{
}
这是我在评论中提出的linq方法:
首先从您的文件列表中获取所有不同的ID
string [] allDistinctIDs = filelist.Select(x=>x.Split('_').First()).Distinct(). ToArray();
现在,您可以遍历ID列表并比较每个值
for (int i = 0; i < allDistinctIDs.Length; i++)
{
string [] allSameIDStrings = filelist.Where(x=>x.Split('_').First() == allDistinctIDs[i]).ToArray();
}
基本上你用'_'
分割每个项目,并将字符串的第一个(id部分)与不同ID列表中的每个项目进行比较。
另一种方法是使用GroupBy。
// example input
string[] filelist = {
"123_Name1_xxx_Asset.tsv",
"456_Name2_xxx_Asset.tsv",
"123_Name3_xxx_HouseHold.tsv",
"456_Name4_xxx_HouseHold.tsv"};
IEnumerable<IGrouping<string, string>> ID_Groups = filelist.GroupBy(x=>x.Split('_').First());
这将为您提供按ID分组的所有文件名的集合:
在ID_Groups
的每个位置都是具有相同ID的项目列表。您可以按fileName过滤它们:
foreach (var id_group in ID_Groups)
{
assets = ReadDataFromCsv<Asset>(id_group.FirstOrDefault(x=>x.ToLower().Contains("assets.tsv")));
// and so on
households = ReadDataFromCsv<Household>(id_group.FirstOrDefault(x=>x.ToLower().Contains("households.tsv")));
}
你必须为你定义什么是“相似的”。它可能是文件名的首字母?一半吗?整个文件名?
如果不使用Linq或者比循环更复杂的东西,这个函数应该或多或少地做你想要的。
var IDOffileNameIWant = object.GetFiles()[0].id;
List<string> arrayThatContainsSimilar = new List<string>();
foreach(var file in object.GetFiles())
{
if(file.Name.Split('_')[0].Contains(IDOffileNameIWant))
{
arrayThatContainsSimilar.Add(file.Name);
}
}
这是非常基础的,可以进行改进,但你必须提供更多关于你想要获得的确切结果的细节。
既然你还在苦苦挣扎,这是一个有效的例子:
List<string> files = new List<string>() {
"123_novica_file1", "123_novica_file3", "123_novica_file2", "456_myfilename_file1",
"789_myfilename_file1", "101_novica_file2", "102_novica_file3"};
List<string> filesbyID = new List<string>();
List<string> filesbyName = new List<string>();
string theIDPattern = "123";
string theFileNamePattern = "myfilename";
foreach(var file in files)
{
//splitting the filename and checking by ID
if(file.Split('_')[0].Contains(theIDPattern))
{
filesbyID.Add(file);
}
//splitting the filename and checking by name
if (file.Split('_')[1].Contains(theFileNamePattern))
{
filesbyName.Add(file);
}
}
结果:
id的文件:
123_novica_file1
123_novica_file3
123_novica_file2
文件名称:
456_myfilename_file1
789_myfilename_file1