Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从列表中删除字符串的一部分<;字符串>;_C#_Linq_Select - Fatal编程技术网

C# 从列表中删除字符串的一部分<;字符串>;

C# 从列表中删除字符串的一部分<;字符串>;,c#,linq,select,C#,Linq,Select,我有一个列表,字符串部分表示我需要过滤掉的文件名:包含字符“&”之前的任何内容都必须删除 List<string> zippedTransactions = new List<string>(); zippedTransactions.Add("33396&20151007112154000549659S03333396SUMMARIES.PDF"); zippedTransactions.Add("33395&2015100711240000054965

我有一个
列表
,字符串部分表示我需要过滤掉的文件名:包含字符“&”之前的任何内容都必须删除

List<string> zippedTransactions = new List<string>();
zippedTransactions.Add("33396&20151007112154000549659S03333396SUMMARIES.PDF");
zippedTransactions.Add("33395&20151007112400000549659S03333395SUMMARIES.PDF");
zippedTransactions.Add("33397&20151007112555000549659S03333397SUMMARIES.PDF");

// desired output:
// "20151007112154000549659S03333396SUMMARIES.PDF";
// "20151007112400000549659S03333395SUMMARIES.PDF";
// "20151007112555000549659S03333397SUMMARIES.PDF"
List-zippedTransactions=new-List();
zippedTransactions.Add(“33396&20151007112154000549659S03333396摘要.PDF”);
zippedTransactions.Add(“33395&20151007112400000549659S03333395摘要.PDF”);
zippedTransactions.Add(“33397&20151007112555000549659S03333397摘要.PDF”);
//期望输出:
//“20151007112154000549659S03333396摘要.PDF”;
//“20151007112400000549659S03333395摘要.PDF”;
//“20151007112555000549659S03333397摘要.PDF”

注意:我不想给它一个经典的迭代式外观,因为C提供了大量的功能接口来与这种数据结构交互,我想开始使用它。

以下代码将帮助您

for (int i = 0; i < zippedTransactions.Count; i++)
{
    string[] result = zippedTransactions[i].Split('&');
    zippedTransactions[i] = result[result.Length-1];
}
for(int i=0;i
使用string.Split在所需字符处拆分字符串并检索所需部分:

foreach (var item in zippedTransactions)
{
    string[] result = item.Split('&');
    Console.WriteLine(result[1]);
}

下面是一个使用正则表达式的Linq方法

Transactions = Transactions.Select(x => Regex.Replace(x, ".*&", string.Empty)).ToList();
如果文件名中没有
&
,那么与
拆分('&')[1]
相比,它的容错性更强

for (int i = 0; i < zippedTransactions.Count; i++)
                {
                   zippedTransactions[i] = zippedTransactions[i].Split('&')[1]; 
                }
for(int i=0;i
您可以使用string.IndexOf函数查找字符串中某个字符的位置,然后使用string.Remove删除该字符:

for(int i =0; i < zippedTransactions.Count; i++)
{
    int count = zippedTransactions[i].IndexOf("&") + 1;
    zippedTransactions[i] = zippedTransactions[i].Remove(0, count);
}
for(int i=0;i
如果您碰巧有visual studio,并且有一个支持的版本,我建议您试试这个

> zippedTransactions = new List<string>() { 
    "33396&20151007112154000549659S03333396SUMMARIES.PDF", 
    "33395&20151007112400000549659S03333395SUMMARIES.PDF", 
    "33397&20151007112555000549659S03333397SUMMARIES.PDF"
  };
> 
> zippedTransactions.Select(dirname => dirname.Split('&')[1])
Enumerable.WhereSelectListIterator<string, string> { "20151007112154000549659S03333396SUMMARIES.PDF", "20151007112400000549659S03333395SUMMARIES.PDF", "20151007112555000549659S03333397SUMMARIES.PDF" }
> 
>zippedTransactions=new List(){
“33396&20151007112154000549659S03333396摘要.PDF”,
“33395&20151007112400000549659S03333395摘要.PDF”,
“33397&20151007112555000549659S03333397摘要.PDF”
};
> 
>zippedTransactions.Select(dirname=>dirname.Split('&')[1])
Enumerable.WhereSelectListIterator{“20151007112154000549659S03333396SUMMARIES.PDF”、“20151007112400000549659S03333395SUMMARIES.PDF”、“20151007112555000549659S03333397SUMMARIES.PDF”}
> 
即使你没有,你也可以通过查看代码来了解发生了什么

WhereSelectListIterator
是一个数据结构,其中包含您要在该数据结构上执行的逻辑。只有当您使用它时(例如,在末尾调用
.ToList()
),才会对其进行计算(读取:循环实际上发生)


这段代码将只接受在“&”上拆分字符串后的第二个元素,因此您可能需要对其进行泛化或根据您的需求对其进行调整。

好的,您尝试过什么了吗?我建议分两步解决这个问题:1)找出如何为单个输入字符串获得所需的值。2) 研究如何将其应用于字符串列表。我有一种使用foreach的方法,但我想避免循环的迭代。有些东西必须迭代,不是吗?您可以使用LINQ将迭代移动到库代码中,但它仍然会涉及到迭代。那么,你到底为什么要把一个简单的for循环过度复杂化…?太棒了,但它仍然会涉及到内部迭代。最好添加一些词语来描述你的答案,而不是只发布代码的答案不太正确。这不仅需要对
结果进行长度检查
,而且如果字符串中有多个&characters,也不会正确操作;只需要最后一件。由于String.Split总是在数组中给出至少一个结果,因此更好的解决方案是
zippedTransactions[i]=result[result.Length-1]