如果值匹配,从另一个字符串数组中获取字符

时间:2016-12-11 07:23:58

标签: c# arrays linq

字符串数组1 :(采用以下格式:<MENU>|<Not Served?>|<Alternate item served>

Burger|True|Sandwich
Pizza|True|Hot Dog

字符串数组2 :(包含菜单)

Burger
Pizza
Grill Chicken
Pasta

我需要提供菜单或为该特定项目提供的任何备用项目。

代码:

for(int i = 0; i < strArr2.Length; i++)
{
    if(strArr2.Any(_r => _r.Split('|').Any(_rS => _rS.Contains(strArr1[i])))) 
    {
        var menu = strArr2[i];
        var alternate = ? // need to get alternate item
    }
}

正如我在代码中评论的那样,如何获取该字符串数组中的备用项?请提前帮助,谢谢。

P.S:如果条件也欢迎,任何有助于修剪的帮助。

3 个答案:

答案 0 :(得分:1)

为了简化代码,最好将任务分开。例如,在将内容转换为对象后,处理字符串数组1的内容会更容易,例如。

class NotServedMenu
{
    public string Menu { get; set; }
    public bool NotServed { get; set; }
    public string AlternateMenu { get; set; }
}

您可以先将字符串读取到列表中,而不是使用字符串数组:

private IEnumerable<NotServedMenu> NotServedMenusFromStrings(IEnumerable<string> strings)
{
    return (from x in strings select ParseNotServedMenuFromString(x)).ToArray();
}

private NotServedMenu ParseNotServedMenuFromString(string str)
{
    var parts = str.Split('|');
    // Validate
    if (parts.Length != 3)
        throw new ArgumentException(string.Format("Unable to parse \"{0}\" to an object of type {1}", str, typeof(NotServedMenu).FullName));
    bool notServedVal;
    if (!bool.TryParse(parts[1], out notServedVal))
        throw new ArgumentException(string.Format("Unable to read bool value from \"{0}\" in string \"{1}\".", parts[1], str));
    // Create object
    return new NotServedMenu() { Menu = parts[0], 
                                 NotServed = notServedVal, 
                                 AlternateMenu = parts[2] }; 
}

一旦您可以使用这些对象,后续代码将更加清晰:

var notServedMenusStr = new[] 
{
     "Burger|True|Sandwich", 
     "Pizza|True|Hot Dog"
};
var notServedMenus = NotServedMenusFromStrings(notServedMenusStr);
var menus = new[] 
{
     "Burger", 
     "Pizza", 
     "Grill Chicken", 
     "Pasta"
};
var alternateMenus = (from m in menus join n in notServedMenus on m equals n.Menu select n);
foreach(var m in alternateMenus)
    Console.WriteLine("{0}, {1}, {2}", m.Menu, m.NotServed, m.AlternateMenu);

在此示例中,我使用了Linq联接来查找匹配的项目。

答案 1 :(得分:1)

而不是任何,您可以使用Where来获得值匹配。

@Markus正在详细解答,我只是使用您的代码为您找到快速解决方案。

for(int i = 0; i < strArr2.Length; i++)
{
    if(strArr2.Any(_r => _r.Split('|').Any(_rS => _rS.Contains(strArr1[i])))) 
    {
        var menu = strArr2[i];
        var alternate = strArr2.Where(_rs => _rs.Split('|').Any(_rS => _rS.Contains(strArr1[i]))).First().Split('|').Last();
    }
}

答案 2 :(得分:0)

你可以做那样的事情

string[] strArr1 = { "Burger|True|Sandwich", "Pizza|True|Hot Dog" };
string[] strArr2 = { "Burger", "Pizza", "Grill Chicken", "Pasta" };

foreach (string str2 in strArr2)
{
    string str1 = strArr1.FirstOrDefault(str => str.Contains(str2));
    if (str1 != null)
    {
        string[] splited = str1.Split('|');
        string first = splited[0];
        bool condition = Convert.ToBoolean(splited[1]);
        string second = splited[2];
     }
}