C# list<string> 包含特定字符串
C# list<string> contains specific string
我有一个字符串列表 (thing1-3, else1-3, other1-3),我想创建一个仅包含 (thing, else, other) 的简化列表。看起来很简单(或者至少这是使用 Classic VB Dictionary .Exists 函数),但我被卡住了。所以我正在检查字符串是否以我的简化字符串之一开头,然后如果简化列表不包含该字符串,则添加它。但是检查简化列表是否包含字符串已经让我失望了。
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"); }
}
}
我希望这个 mySimplifiedList 包含 "thing"、"else"、"other",但它包含 thing1-3、else1-2、other1-3。
if (myListSimplified.Exists("thing")) { }
IntelliSense returns“无法从 'string' 转换为 'System.Predicate'
好的..所以这个:
if (!myListSimplified.Any(str => str.Contains("thing"))) { myListSimplified.Add("thing"); }
或
if (!myListSimplified.Exists(str => str.Contains("thing"))) { myListSimplified.Add("thing"); }
None 这些作品。
显然,我可以创建一个方法来遍历列表并将其与字符串进行比较,但是这个功能似乎太基础了,无法列出 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;
}
我不确定你的问题是什么:
首先,您的第一个代码片段似乎包含错字:您有 List<string> myListSimplified
,但在 foreach
中您引用了 myListSimplifed
(在后面缺少 'i' 'f').
如果我更正了那个拼写错误和 运行 你的代码,我就会得到一个包含 {"thing", "else", "other" }
的列表,这似乎也是你所期望的。
除了 myListSimplifed 与 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();
列表是通用数据类型。他们不知道字符串是什么,因此没有提供开箱即用的工具来搜索 StartWith 或 Contain 的项目其他字符串。一般而言,这种操作没有意义。这就是为什么你有像 Any
这样的操作,它采用 lambda 函数来提供你自己的逻辑:
if (myList.Any(str => str.StartsWith("thing")))
mySimplifiedList.Add("thing");
我已经 tested this 并且工作正常。
当然,如果您有多个要提取的字符串,您应该使它更通用。最简单的方法是将上面的行提取到一个接收子字符串("thing",在本例中)作为参数的方法。一种更通用的方法(假设它与您的数据和逻辑匹配)是遍历所有字符串,从中删除所有数字,然后存储它。假设 StripNumerals
是一种接收字符串的方法,它可能看起来像这样,其中 Distinct
确保每个字符串只有一个实例。
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();
不要忘记添加
using System.Linq;
如果您愿意尝试此解决方案。
我有一个字符串列表 (thing1-3, else1-3, other1-3),我想创建一个仅包含 (thing, else, other) 的简化列表。看起来很简单(或者至少这是使用 Classic VB Dictionary .Exists 函数),但我被卡住了。所以我正在检查字符串是否以我的简化字符串之一开头,然后如果简化列表不包含该字符串,则添加它。但是检查简化列表是否包含字符串已经让我失望了。
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"); }
}
}
我希望这个 mySimplifiedList 包含 "thing"、"else"、"other",但它包含 thing1-3、else1-2、other1-3。
if (myListSimplified.Exists("thing")) { }
IntelliSense returns“无法从 'string' 转换为 'System.Predicate'
好的..所以这个:
if (!myListSimplified.Any(str => str.Contains("thing"))) { myListSimplified.Add("thing"); }
或
if (!myListSimplified.Exists(str => str.Contains("thing"))) { myListSimplified.Add("thing"); }
None 这些作品。
显然,我可以创建一个方法来遍历列表并将其与字符串进行比较,但是这个功能似乎太基础了,无法列出 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;
}
我不确定你的问题是什么:
首先,您的第一个代码片段似乎包含错字:您有 List<string> myListSimplified
,但在 foreach
中您引用了 myListSimplifed
(在后面缺少 'i' 'f').
如果我更正了那个拼写错误和 运行 你的代码,我就会得到一个包含 {"thing", "else", "other" }
的列表,这似乎也是你所期望的。
除了 myListSimplifed 与 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();
列表是通用数据类型。他们不知道字符串是什么,因此没有提供开箱即用的工具来搜索 StartWith 或 Contain 的项目其他字符串。一般而言,这种操作没有意义。这就是为什么你有像 Any
这样的操作,它采用 lambda 函数来提供你自己的逻辑:
if (myList.Any(str => str.StartsWith("thing")))
mySimplifiedList.Add("thing");
我已经 tested this 并且工作正常。
当然,如果您有多个要提取的字符串,您应该使它更通用。最简单的方法是将上面的行提取到一个接收子字符串("thing",在本例中)作为参数的方法。一种更通用的方法(假设它与您的数据和逻辑匹配)是遍历所有字符串,从中删除所有数字,然后存储它。假设 StripNumerals
是一种接收字符串的方法,它可能看起来像这样,其中 Distinct
确保每个字符串只有一个实例。
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();
不要忘记添加
using System.Linq;
如果您愿意尝试此解决方案。