C# C list包含特定的字符串

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

我有一个字符串列表thing1-3,else1-3,other1-3,我想用justthing,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"); }
   }
}
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;