C# C list包含特定的字符串
我有一个字符串列表thing1-3,else1-3,other1-3,我想用justthing,else,other创建一个简化的列表。看起来很简单,或者至少这是经典的VB字典。Exists函数,但我被卡住了。因此,我正在检查字符串是否以我的一个简化字符串开始,然后如果简化列表不包含该字符串,则添加它。但是,检查简化列表是否包含字符串已经让我感到厌烦了C# C list包含特定的字符串,c#,list,contains,exists,C#,List,Contains,Exists,我有一个字符串列表thing1-3,else1-3,other1-3,我想用justthing,else,other创建一个简化的列表。看起来很简单,或者至少这是经典的VB字典。Exists函数,但我被卡住了。因此,我正在检查字符串是否以我的一个简化字符串开始,然后如果简化列表不包含该字符串,则添加它。但是,检查简化列表是否包含字符串已经让我感到厌烦了 List<string> myList = new List<string>(new string[] { "thing
List<string> myList = new List<string>(new string[] { "thing1", "thing2", "thing3", "else1", "else2", "else3", "other1", "other2", "other3" });
List<string> myListSimplified = new List<string>();
foreach (string s in myList)
{
if (s.StartsWith("thing"))
{
if (!myListSimplifed.Contains("thing")) { myListSimplifed.Add("thing"); }
}
if (s.StartsWith("else"))
{
if (!myListSimplifed.Contains("else")) { myListSimplifed.Add("else"); }
}
if (s.StartsWith("other"))
{
if (!myListSimplifed.Contains("other")) { myListSimplifed.Add("other"); }
}
}
IntelliSense返回无法从“字符串”转换为“System.Predicate”
好的。。因此:
if (!myListSimplified.Any(str => str.Contains("thing"))) { myListSimplified.Add("thing"); }
或
这些都不管用
显然,我可以创建一个方法来遍历列表并将其与字符串进行比较,但是这个功能对于MS遗漏的列表来说似乎太基本了。。。把名单传来传去似乎也很愚蠢
private bool Exists(List<string> lList, string sCompare)
{
bool bVal = false;
foreach (string s in lList)
{
if (s == sCompare) { bVal = true; }
break;
}
return bVal;
}
我不确定你的问题是什么: 首先,您的第一个代码段似乎包含一个输入错误:您已将列表myListSimplified,但在foreach中,您引用myListSimplified,在“f”之后缺少“i”
如果我纠正了这个输入错误并运行了您的代码,那么我会得到一个包含{thing,else,other}的列表,这似乎也是您所期望的。除了myListSimplified vs myListSimplified中的输入错误之外,您的代码示例生成了您希望它做的事情 这不是您所要求的,但您可以用更少的代码行实现相同的效果:
var myList = new List<string> {"thing1", "thing2", "thing3", "else1", "else2", "else3", "other1", "other2", "other3"};
var myListSimplified = myList.Select(s => new string(s.Where(char.IsLetter).ToArray())).Distinct();
列表是通用数据类型。他们不知道字符串是什么,因此他们没有现成的工具来搜索开始于或包含其他字符串的项目。一般来说,这种操作没有意义。这就是为什么像任何操作一样使用lambda函数来提供自己的逻辑:
if (myList.Any(str => str.StartsWith("thing")))
mySimplifiedList.Add("thing");
我买了一个,它很好用
当然,如果您有多个要提取的字符串,您可能应该使其更通用。最简单的方法是将上面的行提取到一个方法,该方法接收子字符串,在本例中作为参数。假设它与您的数据和逻辑匹配,一种更通用的方法是检查所有字符串,从中去掉所有数字,然后存储。假设StripDigitals是一个接收字符串的方法,它可能看起来像这样,并确保每个字符串只有一个实例
var simplifiedList = myList.Select(StripNumerals).Distinct().ToList();
我注意到您在将代码放入Visual Studio时输入错误。结果是正确的,但您的算法远不是通用的。您可以尝试: var有助于简化声明 可以简化列表初始化 通过剥离所有数字获取列表,并对其执行distinct
var myList = new List<string>() { "thing1", "thing2", "thing3", "else1", "else2", "else3", "other1", "other2", "other3" };
var listWithoutNumbers = myList.Select(s =>
{
Regex rgx = new Regex("[0-9]");
return rgx.Replace(s, "");
});
var simplifiedList = listWithoutNumbers.Distinct();
除了打字错误之外,您的原始解决方案也有效。 然而,如果您想要更通用的解决方案,您可以使用这样的解决方案
List<string> myList = new List<string>(new string[] { "thing1", "thing2", "thing3", "else1", "else2", "else3", "other1", "other2", "other3" });
List<string> myListSimplified = myList.Select(s => new String(s.Where(Char.IsLetter).ToArray())).Distinct().ToList();
如果您愿意尝试此解决方案。代码看起来不错,运行时也会返回预期值。你试过调试代码吗?你的主要问题是什么?请注意:要比较字符串是否相等,你应该使用string.Equals..我的错误是,我在这里发布代码时更改了列表名称。你说得对,这确实是我想要的。。然而,我并没有发布全部代码——并非myList上的所有内容都是thing1 thing2等等。。存在异常值,我添加了一些代码,希望能够捕捉到这些异常值。
var myList = new List<string>() { "thing1", "thing2", "thing3", "else1", "else2", "else3", "other1", "other2", "other3" };
var listWithoutNumbers = myList.Select(s =>
{
Regex rgx = new Regex("[0-9]");
return rgx.Replace(s, "");
});
var simplifiedList = listWithoutNumbers.Distinct();
List<string> myList = new List<string>(new string[] { "thing1", "thing2", "thing3", "else1", "else2", "else3", "other1", "other2", "other3" });
List<string> myListSimplified = myList.Select(s => new String(s.Where(Char.IsLetter).ToArray())).Distinct().ToList();
using System.Linq;