2016-12-11 136 views
2

字符串數組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:任何幫助修剪,如果條件也很高興歡迎。

+0

每個數組代表什麼? – haim770

+0

第一個數組僅代表菜單,併爲該菜單提供備用項目。第二個數組代表整體菜單。 –

回答

1

而不是任何,你可以使用從何處獲得值匹配。

@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(); 
    } 
} 
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]; 
    } 
} 
+0

string str1 = strArr1.FirstOrDefault(str => str.Contains(str2)); // str1始終爲空。 –

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連接來查找匹配項。

+0

詳細解釋代碼,讓我以簡單的方式理解!輝煌。 –