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