【问题标题】:More than one string required to match on, a better way? [duplicate]匹配需要多个字符串,更好的方法? [复制]
【发布时间】:2017-05-04 19:32:06
【问题描述】:

我只是在寻找是否有更好的方法来执行以下操作。

假设我有以下字符串:

string fooWeb = "web";
string fooDesktop = "desktop";
string fooMac = "mac";
string fooIphone = "iphone";
string fooAndroid = "android";


list<string> Names = new List<string>();
Names.Add("web");
Names.Add("mac");
Names.Add("iphone");
Names.Add("android");

我正在循环浏览这个列表,我想排除包含例如“web”和“mac”&和“android”的项目,可能还有其他项目。

有没有比我在下面尝试的更好的方法来实现这一点:

foreach (var item in this._repo.FooRepo())
if (!(item.SystemName == "Web" || item.SystemName == "android" || item.SystemName == "mac"))
{
  //add to new list
}
}

我在问,因为我有大约 8 个字符串要检查。

【问题讨论】:

  • 正则表达式有用吗?
  • 在什么意义上更好?更好,这样您就不需要列出所有案例或者您想要更短的代码?对于后者,您可以使用 LINQ:var list = this._repo.FooRepo().Except(new List&lt;string&gt; { "Web", "android", "mac"});,但这会创建额外的列表对象,而这并不是真正需要的。
  • 我猜是后者,因为在 if 语句中写出所有这些似乎很麻烦,以下所有答案都是有效的建议。我更喜欢这个带有 .Except 的 linq。我一直在寻找这样的东西。

标签: c#


【解决方案1】:

您可以创建自己的方法来评估任意数量的字符串,可以在任何时候使用 - 在单独的静态类中:

public static class StringFunctions
{
    public static bool IfContains(this string inString, params string[] comparisonStrings)
    {
        return comparisonStrings.Contains(inString);
    }
}

可以这样称呼

if(!item.SystemName.IfContains("web", "desktop", "mac", "iphone", "android"))
{
    //add to new list
}

您也可以将数组传递给方法

string[] words = { "web", "desktop", "mac", "iphone", "android" };
if(!item.SystemName.IfContains(words))
{
    //add to new list
}

【讨论】:

  • 感谢您的意见,我会这样做的。但我想我正在寻找一种更短的方法。
  • 您的第一个方法可以简化为简单的一行:return comparisonStrings.Contains(inString);
  • @maksymiuk 当然,从它的外观上看我根本没有正确思考xD
【解决方案2】:

第一部分简化:

list<string> Names = new List<string> () {
    "web",
    "mac",
    "iphone",
    "android"
};

或:

var Names = new [] {
    "web",
    "mac",
    "iphone",
    "android"
};

或:

string[] Names = new string[] {
    "web",
    "mac",
    "iphone",
    "android"
};

第二部分简化:

myList.Add(this._repo.FooRepo().Where(i => !Names.Contains(i.SystemName)));

【讨论】:

  • 感谢您的意见 :)
【解决方案3】:

您可以通过它们进入一个数组并使用.Contains() 方法。

var validItems = new [] { "Web", "android", "mac" };

foreach (var item in this._repo.FooRepo())
{
    if (!validItems.Contains(item))
    {
        //add to new list
    }
}

【讨论】:

  • 我知道我可以这样做,但我不需要对每个字符串都这样做吗?
  • 您只需将字符串添加到数组中。如果您有一组有效数据,您将需要将其保存在某个地方。这可以硬编码到数组、数据库、配置文件或其他方式中。
  • 谢谢,我会采纳你的观点的:)
  • 我会接受这个,因为这似乎适合我的场景。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 2013-09-23
  • 2017-05-26
  • 2018-08-03
  • 2017-07-11
  • 2017-10-07
  • 2014-11-02
相关资源
最近更新 更多