C# 需要引用部分文件名数组中倒数第二个元素

C# 需要引用部分文件名数组中倒数第二个元素,c#,arrays,string,split,C#,Arrays,String,Split,我需要在文件名数组中查找部分文件名的不同值。我想用一行字来写。 所以,我有这样的文件名: string[] filenames = {"aaa_ab12345.txt", "bbb_ab12345.txt", "aaa_ac12345.txt", "bbb_ac12345"} 我需要为它的ab12345部分找到不同的值。 所以我现在有一些类似的东西: string[] filenames_partial_distinct = Array.ConvertAll( filename

我需要在文件名数组中查找部分文件名的不同值。我想用一行字来写。 所以,我有这样的文件名:

string[] filenames = {"aaa_ab12345.txt", "bbb_ab12345.txt", "aaa_ac12345.txt", "bbb_ac12345"}
我需要为它的ab12345部分找到不同的值。 所以我现在有一些类似的东西:

string[] filenames_partial_distinct = Array.ConvertAll(
        filenames,
        file => System.IO.Path.GetFileNameWithoutExtension(file)
            .Split({"_","."}, StringSplitOptions.RemoveEmptyEntries)[1]
)
.Distinct()
.ToArray();
现在,我得到了aaa_bbb_ab12345.txt格式的文件名。因此,我需要引用从第二部分到最后一部分的文件名,而不是引用文件名的第二部分。 那个么,若一个元素是Split方法的结果,那个么如何根据一行中数组的长度引用它呢?大致如下:

Array.ConvertAll(filenames, file=>file.Split(separator)[this.Length-2]).Distinct().ToArray();
换句话说,如果一个字符串方法产生一个字符串数组,我如何根据数组的长度立即选择元素:

String.Split()[third from end, fifth from end, etc.];

我通常把这样的问题推迟到其他人去解决。他们非常强大。这种方法还为您提供了检测意外情况并进行适当处理的机会

下面是一个粗略的例子,假设我了解您的要求:

using System;
using System.Linq;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()       
    {
        string MyMatcher(string filename)
        {
           // this pattern may need work depending on what you need - it says
           // extract that pattern between the "()" which is 2 characters and
           // 4 digits, exactly; and can be found in `Groups[1]`.
           Regex r = new Regex(@".*_(\w{2}\d{4}).*", RegexOptions.IgnoreCase);
           Match m = r.Match(filename);
           return m.Success
               ? m.Groups[1].ToString()
               : null; // what should happen here? 
        }

        string[] filenames = 
        {
            "aaa_ab12345.txt",
            "bbb_ab12345.txt",
            "aaa_ac12345.txt",
            "bbb_ac12345",
            "aaa_bbb_ab12345.txt",
            "ae12345.txt" // MyMatcher() return null for this - what should you do if this happens?
        };

        var results = filenames
            .Select(MyMatcher)
            .Distinct();

        foreach (var result in results)
        {
            Console.WriteLine(result);
        }
    }
}
给出:

ab1234
ac1234

这可以进一步细化,例如预编译的正则表达式模式、类中的封装等。

似乎您正在寻找类似以下内容:

string[] arr = filenames.Select(n => n.Substring(n.IndexOf("_") + 1, 7)).Distinct().ToArray();
如果使用GetFileName而不使用OutExtension,则不会有扩展名,因此按“\u1”拆分即可。然后你可以带着最后一部分。最后一部分

输入

string[] filenames = { "aaa_ab12345.txt", "bbb_ab12345.txt",
    "aaa_ac12345.txt", "bbb_ac12345", "aaa_bbb_ab12345.txt" };
你得到结果了吗

{ "ab12345", "ac12345" }

StringSplitOptions.RemoveEmptyEntries仅在扩展名前有以u结尾的文件名时才是必需的。

第二个代码块无效。。。请进行更新,以便我们能为您提供进一步帮助。您能否提供一个更简明的示例,说明您的预期输入集和预期结果。C 8中的新范围/索引在此[^2]中可以很好地使用此字符串:{aaa_ab12345.txt,bbb_ab12345.txt,aaa_ac12345.txt,bbb_ac12345,aaa_bb_ab12345.txt,aaa_ccc_ab12345.txt,aaa_bb_ac12345.txt,aaa_ccc_ac12345.txt}我需要找到由两个字母和四个数字组成的部分的不同值。它总是在前面最后一行。txtI想只做一行。如果你重视那些后来不得不维护代码的程序员的心理健康,请抑制这种愿望。简单、干净,并且没有反斜杠。作为一名教授,我曾经说,正则表达式很棒,应该尽可能避免使用。对于bbb_ac12345,这将失败。显然,它们都没有问题中的“.txt”扩展名。@ChibuezeOpata,不,它不会失败,因为GetFileName WithoutExtension会删除扩展名和点。因此,Split在没有扩展名的情况下总是获得相同的输入。这段代码是tested和works看到最后两段代码片段。
{ "ab12345", "ac12345" }