C# 保存动态添加的相关元素集的最佳方法

C# 保存动态添加的相关元素集的最佳方法,c#,list,C#,List,我有一个文件列表,这些文件的文件名包含一些字符,然后是下划线,然后是其他类似的内容: test_123.txt 我试图做的是循环浏览这些文件,拉出“前缀”(字符最多但不包括。),如果前缀不在列表中,则将其添加到列表中,然后将整个文件名添加为该前缀的一个元素 这可能会让人困惑,下面是一个例子: 文件名列表: A_ieie.txt B_ldld.txt C_test.txt A_232.txt B_file2.txt C_345.txt 我在这些文件中循环,得到前缀如下: string prefi

我有一个文件列表,这些文件的文件名包含一些字符,然后是下划线,然后是其他类似的内容:

test_123.txt

我试图做的是循环浏览这些文件,拉出“前缀”(字符最多但不包括
),如果前缀不在列表中,则将其添加到列表中,然后将整个文件名添加为该前缀的一个元素

这可能会让人困惑,下面是一个例子:

文件名列表:

A_ieie.txt
B_ldld.txt
C_test.txt
A_232.txt
B_file2.txt
C_345.txt
我在这些文件中循环,得到前缀如下:

string prefix = fileName.Substring(0, fileName.IndexOf('_'));
现在,我检查前缀是否已经在前缀列表中,如果没有,则添加它:

List<string> prefixes = new List<string>();

if (!prefixes.Contains(prefix))
{
    prefixes.Add(prefix);
}
好的,上面的操作很容易,但是当我想将共享前缀的文件名添加到列表中时,该怎么办

由于这些都是动态添加的,可以是任何内容,所以我不能在手前列出几个列表。我曾想过要有一个
列表的
列表,但这真的是最好的方法吗?一个类是理想的吗

上述示例的最终目标类似于:

[0][0] = A_ieie.txt   //This is the 'A' list
[0][1] = A_232.txt  
[1][0] = B_ldld.txt   //This is the 'B' list
[1][1] = B_file2.txt  
[2][0] = C_test.txt   //This is the 'C' list
[2][1] = C_345.txt

听起来你想要一本字典:

var list = new Dictionary<string, List<string>>();

听起来你想要一本字典>

然后,每个列表由一个键整数引用(或使用字符串“命名”列表):

public Dictionary myBookList=new Dictionary();
私有void addList(字符串列表名,列表内容)
{
添加(列表名,目录);
//直接添加
列出科幻书籍=新列表();
添加(“科幻小说”,科幻书);
myBookList[“科幻小说”]。添加(“mytitle.txt”);
myBookList[“科幻小说”][0]=“我的书名.txt”;
字符串fileLocation=@“c:\mydirectory\MyList\myBookTitle.txt”;
myBookList[“科幻小说”].Add(System.IO.Path.GetFileName(fileLocation));
//等等。
}
这个怎么样:

var textFileNameList =
  new List<string>{"A_ieie.txt","B_ldld.txt","C_test.txt",
                    "A_232.txt","B_file2.txt","C_345.txt"};

        var groupedList = textFileNameList.GroupBy(t => t.Split('_')[0])
            .Select( t=> new {

                Prefix = t.Key,
                Files = t.Select( file=> file).ToList()
            }).ToList();
var textFileNameList=
新列表{“A_ieie.txt”、“B_ldld.txt”、“C_test.txt”,
“A_232.txt”、“B_file2.txt”、“C_345.txt”};
var groupedList=textFileNameList.GroupBy(t=>t.Split(“”“)[0])
.选择(t=>new{
前缀=t.键,
Files=t.Select(file=>file).ToList()
}).ToList();

您可以使用
linq
来实现这一点

List<string> List = new List<string>() { "A_ieie.txt", "B_ldld.txt",    "C_test.txt", "A_232.txt", "B_file2.txt", "C_345.txt" };
Dictionary<string, List<string>> Dict = new Dictionary<string, List<string>>();
Dict = List.GroupBy(x => x.Split('_')[0]).ToDictionary(x => x.Key, x => x.ToList());
List List=newlist(){“A_ieie.txt”、“B_ldld.txt”、“C_test.txt”、“A_232.txt”、“B_file2.txt”、“C_345.txt”};
Dictionary Dict=新字典();
Dict=List.GroupBy(x=>x.Split(“”“')[0]).ToDictionary(x=>x.Key,x=>x.ToList());

Hmm听起来是个好主意。忘了字典吧。我会测试一下,让你知道它是如何工作的。谢谢!@Lee Gunn,如果他不想重复文件名,是字典()正确吗?是的,是的,如果这是个问题,那么可能是一个哈希集而不是列表同意!+1在这方面所有答案都有效,但你是第一个。再次感谢!你也可以使用alreadySeen作为键来编写字典
public Dictionary<string, List<string>> myBookList = new Dictionary<string, List<string>>();
    private void addList(string listName, List<string> contents)
    {
        myBookList.Add(listName, contents);
        //direct add
        List<string> science_Fiction_Books = new List<string>();

        myBookList.Add("Science Fiction", science_Fiction_Books);
        myBookList["Science_Fiction"].Add("mytitle.txt");
        myBookList["Science_Fiction"][0] = "My book title.txt";
        string fileLocation = @"c:\mydirectory\mylists\myBookTitle.txt";
        myBookList["Science_Fiction"].Add(System.IO.Path.GetFileName(fileLocation));
        //etc.
    }
var textFileNameList =
  new List<string>{"A_ieie.txt","B_ldld.txt","C_test.txt",
                    "A_232.txt","B_file2.txt","C_345.txt"};

        var groupedList = textFileNameList.GroupBy(t => t.Split('_')[0])
            .Select( t=> new {

                Prefix = t.Key,
                Files = t.Select( file=> file).ToList()
            }).ToList();
List<string> List = new List<string>() { "A_ieie.txt", "B_ldld.txt",    "C_test.txt", "A_232.txt", "B_file2.txt", "C_345.txt" };
Dictionary<string, List<string>> Dict = new Dictionary<string, List<string>>();
Dict = List.GroupBy(x => x.Split('_')[0]).ToDictionary(x => x.Key, x => x.ToList());