2017-05-08 140 views
0

我試圖找出哪些List<int>出許多具有一定規模的元素簡化IF子句和LINQ select語句

的發現變量的名稱,例如輸入:

List<int> list_1 = Enumerable.Range(1, 299).ToList(); 
List<int> list_2 = Enumerable.Range(1, 300).ToList(); 
List<int> list_3 = Enumerable.Range(1, 300).ToList(); 
List<int> list_4 = Enumerable.Range(1, 297).ToList(); 

我需要什麼是記錄名稱的名單和金額的項目if它已經少於我們說的300個值。現在,我可以爲每個列表做當然是一個if條款:

if (list_1.Count != 300) 
{ 
    //log name and number of items 
} 
if(list_2 ... and so on) 

問:是否有查不到這個信息的更優雅的方式?

我試過一個LINQ解決方案,並將所有列表放入一個進行過濾。但在這我的問題是,我不能得到名稱:

List<List<int>> allLists = new List<List<int>>(); 

allLists.Add(list_1); 
allLists.Add(list_2); 
allLists.Add(list_3); 
allLists.Add(list_4); 

string logRes = String.Join(" ", allLists.Where(x=>x.Count < 300) 
     .Select(x=> String.Format("Name: {0} Amount: {1}", nameof(x), x.Count))); 

它返回:

名稱:X金額:299名稱:X金額:297

問題2:我怎樣才能得到集合中邪惡列表的名字?

+3

不會讓使用'詞典更有意義<字符串列表>',而不是列表清單?密鑰可能包含列表的名稱。 –

+0

如果你使用的是C#6.0,你也可以使用NameOf表達式:http://gigi.nullneuron.net/gigilabs/c-6-preview-nameof-expressions/然而我同意字典會更優雅在這裏解決。 –

+1

@MasterYoda:他使用namof,但是這對LINQ查詢沒有幫助 –

回答

3

可以使用reflection或不同的集合,如f.e.一個Dictionary<string, List<int>>

var listNames = new Dictionary<string, List<int>>(); 
listNames.Add(nameof(list_1), list_1); 
listNames.Add(nameof(list_2), list_2); 
listNames.Add(nameof(list_3), list_3); 
listNames.Add(nameof(list_4), list_4); 

string logRes = String.Join(" ", listNames 
    .Where(kv => kv.Value.Count < 300) 
    .Select(kv => $"Name: {kv.Key} Amount: {kv.Value.Count}")); 
+0

謝謝你的字典建議。這是避免多個if-clause的最好方法嗎? –

+0

@MongZhu:指定_best_,在我看來它是一個可讀和簡潔的版本,是的。試圖指定: –

+0

:代碼少但仍可讀。例如,如果我有10個列表,它會變得非常狂野。但是,也可能是我應該重新考慮將數據保存在第一位的設計。我喜歡你的解決方案,再次thanx –

0

您可以修改代碼以包含列表的名稱與實際列表一起:

Dictionary<string, List<int>> allLists = new Dictionary<string, List<int>>(); 

allLists.Add("list_1", list_1); 
allLists.Add("list_2", list_2); 
allLists.Add("list_3", list_3); 
allLists.Add("list_4", list_4); 

string logRes = String.Join(" ", allLists 
    .Where(x => x.Value.Count < 300) 
    .Select(x => String.Format("Name: {0} Amount: {1}", x.Key, x.Value.Count))); 
+0

你的回答與@Tim Schmelter完全相同..但是他在你之前4分鐘.. –

+0

@SeanStayn不完全一樣,只有在C#6.0之後才能工作。看起來我花了相當長的時間打字我的答案。 – sachin