2017-05-08 134 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