用于查询字典的LINQ语法.ToList()。Where()

时间:2014-05-13 20:03:29

标签: linq

我正在尝试为我的LINQ语句获取正确的语法。我有一个字典,然后是一个检查该字典中的值的方法。我试图计算消息列出值不为空或空(可以在别处操纵)

    ScannerMessages = new Dictionary<string, string>();
    public enum ScanType { GoodScan, Reprint, BadScan, DiscernScanType}
    public ScanType equalMessages()
    {
        lock (lckObj)
        {
            int x = ScannerMessages.Values.ToList().Distinct().Count();
            int y = ScannerMessages.Values.ToList().Count;

            if (ScannerMessages.Values.All(s => string.IsNullOrEmpty(s))) return ScanType.BadScan;
            else if (_ScannerCount == 1) return ScanType.DiscernScanType;
            else if (x < y) return ScanType.GoodScan;
            else if (ScannerMessages.Values.ToList().Distinct().Where(x => x.Value != string.IsNullOrEmpty()).Count() == 1) return ScanType.Reprint;
            else return ScanType.BadScan;
        }
    }

这个声明是关闭的

    ScannerMessages.Values.ToList().Distinct().Where(x => x.Value != string.IsNullOrEmpty()).Count()

我也尝试了ToList()两边的列表创建(但它们也错了)

ScannerMessages.Values.Where(x => x.Value != string.IsNullOrEmpty()).ToList().Distinct().Count()
ScannerMessages.Values.ToList().Where(x => x.Value != string.IsNullOrEmpty()).Distinct().Count()

3 个答案:

答案 0 :(得分:3)

 ScannerMessages.Values.Distinct().Count(v => !String.IsNullOrEmpty(v))
  1. 您已经选择了值,因此您已经拥有了一系列字符串,并且您不需要尝试使用x.Value
  2. 从字符串中获取值
  3. 您应该将字符串传递给String.IsNulllOrEmpty方法以验证此字符串是否为空或
  4. 您不需要创建包含字典值的列表 - ValueCollection实现IEnumerable<string>,因此您可以直接使用Linq方法(例如DistinctWhere
  5. 如果您想按顺序计算与某些条件匹配的项目(即谓词),那么您可以使用带有谓词的快捷方式重载Count(predicate)方法来代替使用Where(predicate).Count()

答案 1 :(得分:0)

Value上没有string属性。Values属性为您提供ValueCollection而不是KeyValuePairs的集合。你只需要:

ScannerMessages.Values.Distinct().Count(x => !string.IsNullOrEmpty(x));

答案 2 :(得分:0)

尚未测试,但这部分看起来不对:

x.Value != string.IsNullOrEmpty()

您正在将项的值与布尔函数的返回值进行比较。您应该测试返回值:

string.IsNullOrEmpty(x.Value)

或检查字符串是否等于某事或其他

x.Value != ""

x.Value != null

或两者的某种组合。