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



我需要在文件名数组中找到部分文件名的不同值。我想在一行中完成。 所以,我有类似的东西作为文件名:

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.];

如果你使用GetFileNameWithoutExtension,就不会有扩展名,因此按'_'拆分就可以了。然后你可以拿最后一部分.Last().

string[] filenames_partial_distinct = Array.ConvertAll(
filenames,
file => Path.GetFileNameWithoutExtension(file).Split('_').Last()
)
.Distinct()
.ToArray();

使用输入

string[] filenames = { "aaa_ab12345.txt", "bbb_ab12345.txt",
"aaa_ac12345.txt", "bbb_ac12345", "aaa_bbb_ab12345.txt" };

你得到结果

{ "ab12345", "ac12345" }

仅当文件名以_结尾(在扩展名之前(时,才需要StringSplitOptions.RemoveEmptyEntries

似乎您正在寻找这样的东西:

string[] arr = filenames.Select(n => n.Substring(n.IndexOf("_") + 1, 7)).Distinct().ToArray();

我通常将这样的问题推迟到正则表达式。他们非常强大。此方法还使您有机会检测意外情况并适当处理它们。

这是一个粗略的例子,假设我了解你的要求:

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

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

最新更新