C# 如何将列表项拆分为以特定值开头的列表?

C# 如何将列表项拆分为以特定值开头的列表?,c#,C#,我有以下清单 var mainList = new List<string> { "Reset","Set","Test","Test","Reset","Test","Test"}; 如何拆分列表?如果我理解正确,您希望这样做 var mainList = new List<string> { "Reset", "Set", "Test", "Test", "Reset", "Test", "Test" }; List<string> jask = new

我有以下清单

var mainList = new List<string>
{ "Reset","Set","Test","Test","Reset","Test","Test"};

如何拆分列表?

如果我理解正确,您希望这样做

var mainList = new List<string> { "Reset", "Set", "Test", "Test", "Reset", "Test", "Test" };
List<string> jask = new List<string>();
List<string> jask1 = new List<string>();
jask = mainList.Take(4).ToList();
jask1 = mainList.Skip(4).ToList();
var mainList=新列表{“重置”、“设置”、“测试”、“测试”、“重置”、“测试”、“测试”};
List jask=新列表();
List jask1=新列表();
jask=mainList.Take(4.ToList();
jask1=mainList.Skip(4.ToList();
后来我知道你想用“重置”来分割它,然后你就可以这样做了

var mainList = new List<string> { "Reset", "Set", "Test", "Test", "Reset", "Test", "Test" };
List<string> jask = new List<string>();
string ksjd =  string.Join(",", mainList.ToArray());
jask = Regex.Split(ksjd, @"(?=Reset)").Skip(1).ToList();
var mainList=新列表{“重置”、“设置”、“测试”、“测试”、“重置”、“测试”、“测试”};
List jask=新列表();
string ksjd=string.Join(“,”,mainList.ToArray());
jask=Regex.Split(ksjd,@“(?=Reset)”).Skip(1.ToList();

我认为您必须在这里使用字典来获取结果组,如下所示:

var mainList = new List<string> { "Reset", "Set", "Test", "Test", "Reset", "Test", "Test" };
Dictionary<int, List<string>> resultList = new Dictionary<int, List<string>>();
int DictionaryIndex = 0;
foreach (string item in mainList)
{
    if (item == "Reset")
    {
        resultList.Add(++DictionaryIndex, new List<string>() { item });
    }
    else
    {
        resultList[DictionaryIndex].Add(item);
    }
}
var mainList=新列表{“重置”、“设置”、“测试”、“测试”、“重置”、“测试”、“测试”};
Dictionary resultList=新建字典();
int字典索引=0;
foreach(主列表中的字符串项)
{
如果(项目==“重置”)
{
Add(++DictionaryIndex,newlist(){item});
}
其他的
{
结果列表[DictionaryIndex]。添加(项);
}
}
resultList
将根据需要包含单独的列表。您可以查看一下,让我知道它是否满足您的要求。

尝试以下方法:

//伪码

while (index < len)
{
  int nextOccurence = arrayList.IndexOf(delimeterString, index)
  output.Add (arrayList.GetRange(index, nextOccurence))
  index = nextOccurence + 1
}
while(索引

var mainList = new List<string> { "Reset", "Set", "Test", "Test", "Reset",        "Test", "Test" };
        var lastIndex = mainList.FindLastIndex(x => x.Equals("Reset"));
        var firstList = new List<string>();
        var secondList = new List<string>();
        for (int i = 0; i < mainList.Count - 1; i++)
        {
            if (i < lastIndex)
            {
                firstList.Add(mainList[i]);
            }
            else
            {
                secondList.Add(mainList[i]);
            }
        }
var mainList=新列表{“重置”、“设置”、“测试”、“测试”、“重置”、“测试”、“测试”};
var lastIndex=mainList.FindLastIndex(x=>x.Equals(“重置”));
var firstList=新列表();
var secondList=新列表();
对于(int i=0;i
试试这个

public static void SplitList()
    {
        var mainList = new List<string> { "Reset", "Set", "Test", "Test", "Reset", "Test", "Test" };

        List<List<string>> lstOutputLists = new List<List<string>>();
        List<string> tmp = new List<string>();
        foreach (var item in mainList)
        {
            if (item == "Reset")
            {
                if (tmp.Count != 0)
                {
                    lstOutputLists.Add(tmp);
                    tmp = new List<string>();    
                }

            }
            tmp.Add(item);
        }
        lstOutputLists.Add(tmp);
    }
public静态void SplitList()
{
var mainList=新列表{“重置”、“设置”、“测试”、“测试”、“重置”、“测试”、“测试”};
List lstOutputLists=新列表();
List tmp=新列表();
foreach(主列表中的变量项)
{
如果(项目==“重置”)
{
如果(tmp.Count!=0)
{
lstOutputLists.Add(tmp);
tmp=新列表();
}
}
tmp.Add(项目);
}
lstOutputLists.Add(tmp);
}
lstOutputList将为您提供输出

类似这样:

var result = string
    .Join("|", mainList)
    //     ^ use a special character/pattern that will never use in your texts
    .Replace("Reset", "|@|Reset")
    //                 ^^^ use a special pattern for identifying place of `Reset`  
    .Split(new [] { "|@|" }, StringSplitOptions.RemoveEmptyEntries)
    // at first I split by place of `Reset` to create a list of strings that identifies by `|@|`
    .Select(c => c.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries))
    // now each string will become a list of strings
    .ToList();

在LinQ完全模式下,我还可以建议这样做:
注意:Thjis方法的工作原理与SQL中的分区类似

var i = 1;
var result = mainList
    .Select(str =>
    {
        if (str == "Reset") i++;
        return new { str, i };
    })
    //  ^^ Above I make partitions by `i`; that `i` will change by watching a `Reset`
    .GroupBy(g => g.i)
    .Select(g => g.Select(c => c.str).ToList());
    // then I just group by `i` as partition then removing it from results.

下面的解决方案假设您在“重置”文本之前进行拆分,所以如果第一个字段不是“重置”,那么它将跳过所有元素,直到找到“重置”

  public static List<List<string>> Split(this List<string> list, string splitter)
        {
            var _list = new List<List<string>>();
            var count = list.Count(x => x == splitter);
            list.ForEach(item =>
            {
                if(item == splitter)
                {
                    _list.Add(new List<string>());
                }
                _list.LastOrDefault()?.Add(item);
            });
            return _list.ToList();
        }
公共静态列表拆分(此列表,字符串拆分器)
{
var_list=新列表();
var count=list.count(x=>x==splitter);
list.ForEach(项=>
{
如果(项==拆分器)
{
_添加(新列表());
}
_list.LastOrDefault()?.Add(项);
});
return_list.ToList();
}
用法

var mainList=新列表
{“设置”、“测试”、“测试”、“重置”、“测试”、“测试”};
var res=mainList.Split(“重置”);

输入格式是否固定?我的意思是,它总是列表吗?是的,它总是列表。试试我的解决方案,看看是否适合你。谢谢。“复位”的位置不固定。因此,当“重置”的索引更改时,您的答案不适用。您的第二种方法将产生
IEnumerable
“重置、设置、测试、测试”,“重置、测试、测试”
数据;这不是OP想要的;)。谢谢你!我使用您的拆分列表()获得了列表。如果mainList有更多的元素,它可以很好地工作!谢谢A.T。!它工作得很好,最好将“splitter”作为参数。请注意我使用的空条件运算符,它的c#6特性谢谢,在我的开发环境中允许使用c#6特性。
  public static List<List<string>> Split(this List<string> list, string splitter)
        {
            var _list = new List<List<string>>();
            var count = list.Count(x => x == splitter);
            list.ForEach(item =>
            {
                if(item == splitter)
                {
                    _list.Add(new List<string>());
                }
                _list.LastOrDefault()?.Add(item);
            });
            return _list.ToList();
        }
 var mainList = new List<string>
                          { "Set","Test","Test","Reset","Test","Test"};
 var res = mainList.Split("Reset");