我在数组中有多个对象,格式为:
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)
{
}
答案 0 :(得分:0)
你必须定义什么是&#34;类似&#34;给你。它可能是文件名的首字母?一半吗?整个文件名?
如果不使用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
答案 1 :(得分:0)
这是我在评论中提出的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")));
}