从数组

时间:2018-01-22 12:49:33

标签: c# arrays

我在数组中有多个对象,格式为:

  

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)
{

}

2 个答案:

答案 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分组的所有文件名的集合:

enter image description here

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