2016-05-09 37 views
-2

我有一个List<string>,字符串部分代表我需要过滤的文件名:在包含字符'&'之前的任何内容都必须被删除。删除列表中的字符串的一部分<string>

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" 

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

+2

好的,你还尝试过什么吗?我建议通过两个步骤来解决这个问题:1)弄清楚如何为一个* single *输入字符串获得所需的值。 2)研究如何将它应用于字符串列表。 –

+0

我有一个使用foreach的方法,但我想避免循环迭代。 – Shivam

+2

那么*某些*将不得不迭代,不是吗?你可以使用LINQ将迭代转换为库代码,但它仍然会涉及迭代。 –

回答

6

这里是一个正则表达式的方法的Linq

Transactions = Transactions.Select(x => Regex.Replace(x, ".*&", string.Empty)).ToList(); 

Split('&')[1]相比,这更容错如果没有&在你的文件名

+0

谢谢....喜欢这种方式。至少我不使用旧的foreach来迭代。 – Shivam

+0

太棒了,但它仍然会涉及内部迭代。 –

0

下面的代码将帮助您

for (int i = 0; i < zippedTransactions.Count; i++) 
{ 
    string[] result = zippedTransactions[i].Split('&'); 
    zippedTransactions[i] = result[result.Length-1]; 
} 
+0

不完全正确。这不仅需要对'result'进行长度检查,而且如果字符串中有多个&字符,也不会正确执行;只有最后一块是必需的。由于String.Split总是给出数组中至少一个结果,更好的解决方案是'zippedTransactions [i] = result [result.Length-1];' – Nyerguds

0

使用string.Split字符串在所需的字符分割和检索所需的部分:

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

试试这个

for (int i = 0; i < zippedTransactions.Count; i++) 
       { 
        zippedTransactions[i] = zippedTransactions[i].Split('&')[1]; 
       } 
0

可以使用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); 
} 
+2

这是很好的添加一些词来形容你的答案,而不是只发布一个代码的答案 – Shreevardhan

0

如果你碰巧有视觉工作室,并支持C# Interactive一个版本,我建议你试试这个。

> 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" } 
> 

即使你没有,你也可以通过查看代码来了解发生了什么。

WhereSelectListIterator是一个数据结构,它包含您打算在数据结构上执行的逻辑。只有当你使用它时(例如,在末尾调用.ToList()),它才被评估(读取:实际发生的循环)。

此代码只会将'&'上的字符串拆分后出现的第二个元素,因此您可能想要对它进行概括或调整以满足您的要求。

相关问题