我有一个字符串列表(thing1-3,else1-3,other1-3),我想用(thing,else,other)创建一个简化列表。看起来很直接(或至少这是经典VB字典.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包含&#34; thing&#34;,&#34; else&#34;,&#34; other&#34;,但它包含thing1-3,else1-2,other1- 3。
if (myListSimplified.Exists("thing")) { }
IntelliSense返回&#34;无法转换为&#39; string&#39;到&#39; System.Predicate&#39;
好的..所以这个:
if (!myListSimplified.Any(str => str.Contains("thing"))) { myListSimplified.Add("thing"); }
或者
if (!myListSimplified.Exists(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;
}
答案 0 :(得分:0)
我不确定你的问题是什么:
首先,您的第一个代码段似乎包含一个拼写错误:您有List<string> myListSimplified
但在foreach
内引用myListSimplifed
(缺少&#39; i&#39;在&#39; f&#39;之后。
如果我更正了拼写错误并运行了您的代码,那么我会得到一个包含{"thing", "else", "other" }
的列表,这似乎是您所期望的。
答案 1 :(得分:0)
除了myListSimplifed 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();
答案 2 :(得分:0)
列表是通用数据类型。他们不知道字符串是什么,所以他们没有提供开箱即用的工具来搜索 StartWith 或包含其他字符串的项目。一般来说,这种操作没有意义。这就是为什么像Any
这样的操作采用lambda函数来提供自己的逻辑:
if (myList.Any(str => str.StartsWith("thing")))
mySimplifiedList.Add("thing");
我tested this并且工作正常。
当然,如果你想要提取多个字符串,你应该更加通用。最简单的方法是将上面的行提取到接收子字符串(在本例中为“thing”)作为参数的方法。一种更通用的方法(假设它与您的数据和逻辑匹配)将遍历所有字符串,从中删除所有数字,并存储它。假设StripNumerals
是一个接收字符串的方法,它可能看起来像这样,Distinct
确保每个字符串只有一个实例。
var simplifiedList = myList.Select(StripNumerals).Distinct().ToList();
答案 3 :(得分:0)
在将代码放入Visual Studio时,我注意到了您的拼写错误。结果是正确的,但您的算法远非通用。你能尝试什么:
var
对于简化声明非常有用通过剥离所有数字并在其上执行不同的数据来获取列表
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();
答案 4 :(得分:0)
除了拼写错误之外,您的原始解决方案仍有效。 但是,如果您想要更通用的解决方案,可以使用类似这样的
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;
如果您将尝试此解决方案。