値が

2016-12-11 3 views
2

文字列配列1と一致した場合、別の文字列の配列から文字列を取得します(このフォーマットで:<MENU>|<Not Served?>|<Alternate item served>)を文字列配列2値が

Burger|True|Sandwich 
Pizza|True|Hot Dog 

:(メニューが含まれる)

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

最初の配列はメニューのみを表し、代替アイテムはそのメニューに対して表示されます。 2番目の配列は全体的なメニューを表します。 –

答えて

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

文字列str1 = strArr1.FirstOrDefault(str => str.Contains(str2)); // str1は常にnullです。 –

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

詳細コードで説明し、わかりやすく分かりました!ブリリアント。 –