【问题标题】:How to update a list based on more than one Condition using LINQ C#如何使用 LINQ C# 根据多个条件更新列表
【发布时间】:2016-03-15 12:07:13
【问题描述】:

我有一个带有管道符号“|”的字符串分隔,我正在拆分字符串并转换为List<string>。如果List<string> 包含字符串“fax”,则将该字符串替换为“A”,与字符串“phone”一样​​替换为字符串“B”使用内联单 LINQ 语句。不要尝试替换基本字符串str

string str = "fax|mobile|phone";
str.Split('|').Where(i => i.ToLowerInvariant() == "fax" || i.ToLowerInvariant() == "phone").ToList();

所以,我的预期输出应该是

List<string>() {"A", "B"}

【问题讨论】:

  • 使用 Select 方法。在它的委托参数中,您可以对传递的内容采取行动。

标签: c# string linq list


【解决方案1】:

使用 select 转换您的输出。

        str.Split('|')
           .Where(i => i.ToLowerInvariant() == "fax" || i.ToLowerInvariant() == "phone")
           .Select(x=> x=="fax"? "A" : x=="phone"? "B" : x)
           .ToList();

【讨论】:

  • 这不是仅在 c# 6 中可用吗? msdn.microsoft.com/en-gb/magazine/dn802602.aspx 如果 OP 使用的是 c# 6,那么这是要走的路,但可能值得指出。
  • 关闭,但 where 子句使用 ToLowerInvariant 来检查项目 - 选择也应该使用 ToLowerInvariant 来检查。
【解决方案2】:

是这样的:

string str = "fax|mobile|phone";
var result = str.Split('|').Select(i => 
    string.Equals(i, "fax", StringComparison.InvariantCultureIgnoreCase) ? "A" : 
    string.Equals(i, "phone", StringComparison.InvariantCultureIgnoreCase) ? "B" : 
    null)
    .Where(i => i != null)
    .ToList();

请不要更改字符串的大小写来比较它。有非常好的方法可以进行不区分大小写的比较。

这段代码很容易变得非常难以阅读。更好的解决方案是使用单独的Dictionary&lt;,&gt;

var dict = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
dict.Add("fax", "A");
dict.Add("phone", "B");

string str = "fax|mobile|phone";

var result = str.Split('|').Select(i => {
        string r;
        dict.TryGetValue(i, out r);
        return r;
    })
    .Where(i => i != null)
    .ToList();

【讨论】:

  • mobile 也将返回,但不应返回。
【解决方案3】:

试试这个:

        string str = "fax|mobile|phone";
        var result = str.Split('|').Where(i => i.ToLowerInvariant() == "fax" || i.ToLowerInvariant() == "phone").Select(i =>
            i.ToLowerInvariant() == "fax" ? "A" : "B").ToList();

【讨论】:

  • 关闭,但 where 子句使用 ToLowerInvariant 来检查项目 - 选择也应该使用 ToLowerInvariant 来检查。
  • 顺便说一句:你不用回i。 ` i.ToLowerInvariant() == "传真" ? "A" : "B"` 应该足以选择,因为 where 子句过滤了所有其他值。
【解决方案4】:

我确信有更好的解决方案,但这是我的看法:

string str = "fax|mobile|phone";
List<string> list = str.Split('|')
                       .Select(x => x.ToLowerInvariant() == "fax" ? "A" : x.ToLowerInvariant() == "phone" ? "B" : null)
                       .ToList();
list.Remove(null);

list.Remove(null); 可以替换为 Where 子句以获得单行:

List<string> list = str.Split('|')
                       .Select(x => x.ToLowerInvariant() == "fax" ? "A" : x.ToLowerInvariant() == "phone" ? "B" : null)
                       .Where(x => x != null)
                       .ToList();

一个好主意是有一个单独的方法来获取匹配的字符串:

public string GetMatch(string s)
{
    // Easier to maintain
    return s.ToLowerInvariant() == "fax" ? "A" : s.ToLowerInvariant() == "phone" ? "B" : null;
}

然后做:

List<string> list = str.Split('|')
                       .Select(x => GetMatch(x))
                       .Where(x => x != null)
                       .ToList();

【讨论】:

    【解决方案5】:

    基于xanatos解决方案

    var string s = string.Empty;
    var dic = new Dictionary<string,string>(StringComparer.InvariantCultureIgnoreCase)
    {
      {"fax","a"},{"phone","b"}
    }
    var result = (from w in str.split('|') where dic.TryGetValue(w, out s) select s).toList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      相关资源
      最近更新 更多