如何快速分解和重新组合C#List?

如何快速分解和重新组合C#List?,c#,arrays,list,C#,Arrays,List,设置: 我有一个会话变量,它携带一个ID列表,以管道分隔。ID与我的站点中的视图相关,并且与面包屑生成器相关 Session["breadCrumb"] = "1001|1002|1003|1004"; 如果我在1002对应的视图上,我想从会话变量中删除该id之后的所有内容 我想用一些类似于: var curView = "1002"; if (Session["breadCrumb"] != null) { var crumb = Session["breadCrumb"].ToS

设置: 我有一个会话变量,它携带一个ID列表,以管道分隔。ID与我的站点中的视图相关,并且与面包屑生成器相关

Session["breadCrumb"] = "1001|1002|1003|1004";
如果我在1002对应的视图上,我想从会话变量中删除该id之后的所有内容

我想用一些类似于:

var curView = "1002";

if (Session["breadCrumb"] != null) {
    var crumb = Session["breadCrumb"].ToString().Split('|').ToList();
    var viewExists = crumb.Any(c => c.Value == curView);

    if (viewExists) {
        //remove everything after that item in the array.
    }

}

但我对方法论持开放态度。

我几乎对此感到遗憾,但坦率地说,我只选择正则表达式:

var result = Regex.Replace(input, "(?<=(\\||^)" + current + ")(?=\\||$).*", "");

我几乎对此感到遗憾,但坦率地说,我只选择正则表达式:

var result = Regex.Replace(input, "(?<=(\\||^)" + current + ")(?=\\||$).*", "");

您只需在
会话中存储
列表
。这样可以避免手动拆分/合并字符串。我知道这不能直接回答这个问题,但我相信这是一个更好的解决办法

var curView = "1002";

var crumb = Session["breadCrumb"] as List<string>;
if (crumb != null) {
    var viewExists = crumb.Any(c => c.Value == curView);

    if (viewExists) {
        // remove everything after that item in the array.            
    }
}
var curveview=“1002”;
var crumb=会话[“面包屑”]作为列表;
if(crump!=null){
var viewExists=crump.Any(c=>c.Value==curveview);
如果(视图存在){
//删除数组中该项之后的所有内容。
}
}

您只需在
会话中存储
列表
。这样可以避免手动拆分/合并字符串。我知道这不能直接回答这个问题,但我相信这是一个更好的解决办法

var curView = "1002";

var crumb = Session["breadCrumb"] as List<string>;
if (crumb != null) {
    var viewExists = crumb.Any(c => c.Value == curView);

    if (viewExists) {
        // remove everything after that item in the array.            
    }
}
var curveview=“1002”;
var crumb=会话[“面包屑”]作为列表;
if(crump!=null){
var viewExists=crump.Any(c=>c.Value==curveview);
如果(视图存在){
//删除数组中该项之后的所有内容。
}
}
您可以使用仅从当前视图前面的拆分列表中获取项目

var curView = "1002";
if (Session["breadCrumb"] != null) 
{
    var crumb = Session["breadCrumb"].ToString().Split('|').ToList();
    var viewExists = crumb.TakeWhile(c => c != curView).ToList();
    viewExists.Add(curView);
    string result = string.Join("|",viewExists);
}
虽然这种方法可行,但我认为前面的答案(现在错误地从安德鲁·惠特克先生那里删除)也是正确的。使用IndexOf应该更快,更少的拆分、循环和连接字符串。我建议惠特克先生撤销其答复

编辑
这是从中删除的答案。
我将在这里转载,因为我认为它的方法更简单,应该提供更好的性能,所以未来的读者也可以看到这个选项

var crumb = Session["breadCrumb"].ToString()
int index = crumb.IndexOf(curView);
if (index >= 0)
{
    Session["breadCrumb"] = crumb.Substring(0, index + curView.Length);
}
如果安德鲁决定取消删除它的答案,我将很高兴删除这一部分。请告诉我。

您可以使用仅从当前视图之前的拆分列表中获取项目

var curView = "1002";
if (Session["breadCrumb"] != null) 
{
    var crumb = Session["breadCrumb"].ToString().Split('|').ToList();
    var viewExists = crumb.TakeWhile(c => c != curView).ToList();
    viewExists.Add(curView);
    string result = string.Join("|",viewExists);
}
虽然这种方法可行,但我认为前面的答案(现在错误地从安德鲁·惠特克先生那里删除)也是正确的。使用IndexOf应该更快,更少的拆分、循环和连接字符串。我建议惠特克先生撤销其答复

编辑
这是从中删除的答案。
我将在这里转载,因为我认为它的方法更简单,应该提供更好的性能,所以未来的读者也可以看到这个选项

var crumb = Session["breadCrumb"].ToString()
int index = crumb.IndexOf(curView);
if (index >= 0)
{
    Session["breadCrumb"] = crumb.Substring(0, index + curView.Length);
}


如果安德鲁决定取消删除它的答案,我将很高兴删除这一部分。请告诉我。

为什么不在曲线视图上拆分,然后在分隔符上拆分?(仅以分割结果的第0个元素为例)@Tetsujinnoni:因为如果
CurveView
只是
“1”
,会发生什么?我接受OP的例子作为上下文,足以确定可能的范围。我的第一反应是不要将int列表存储为管道分隔的列表,毕竟…@tetsujinnoni:我也是。但为什么要做出非强迫性假设呢?我完全接受其他方法论。我必须承认,我不知道如何在会话中存储/访问列表。为什么不在CurveView上拆分,然后在分隔符上拆分?(仅以分割结果的第0个元素为例)@Tetsujinnoni:因为如果
CurveView
只是
“1”
,会发生什么?我接受OP的例子作为上下文,足以确定可能的范围。我的第一反应是不要将int列表存储为管道分隔的列表,毕竟…@tetsujinnoni:我也是。但为什么要做出非强迫性假设呢?我完全接受其他方法论。我必须承认,我不知道如何在会话中存储/访问列表。这里似乎至少有一个人真的不喜欢正则表达式。我想知道为什么。我还没有试过@Jon的代码,但是RegEx在代码搜索之前。写起来更难,但速度更快,即使数据更大,也能保持性能。我不知道为什么会有反对票。我喜欢这种方法,因为我是regex的粉丝,但最后我在会话中使用了列表。实际上,我用了一个元组列表。这里似乎至少有一个人真的不喜欢正则表达式。我想知道为什么。我还没有试过@Jon的代码,但是RegEx在代码搜索之前。写起来更难,但速度更快,即使数据更大,也能保持性能。我不知道为什么会有反对票。我喜欢这种方法,因为我是regex的粉丝,但最后我在会话中使用了列表。实际上,我使用了一个元组列表。在这个例子中,
c.Value
只是我的伪编码。:)天哪,惠特克先生的答案真的会非常快:不。Split(“|”)和不。ToList()会让事情变得更快。尽管如此,您的答案对于演示.TakeWhile()可以在何处使用还是非常有用的(至少我发现它很有用!)。在这个例子中,
c.Value
只是我的虚拟代码。:)天哪,惠特克先生的答案真的会非常快:不。Split(“|”)和不。ToList()会让事情变得更快。尽管如此,您的答案对于演示在何处可以使用.TakeWhile()还是非常有用的(至少我发现它很有用!)。我非常喜欢这种方法,但是
//删除数组中该项之后的所有内容对我来说也是一个难题。我如何从列表中删除CurveView之后的所有内容?事实上,我自己已经回答了这个子问题。我建立了一个新列表,并在现有列表中进行迭代,将新列表填充到当前视图中,包括当前视图,此时我停止创建新列表,并将会话设置为该列表