我正在尝试为我的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()
答案 0 :(得分:3)
ScannerMessages.Values.Distinct().Count(v => !String.IsNullOrEmpty(v))
x.Value
String.IsNulllOrEmpty
方法以验证此字符串是否为空或ValueCollection
实现IEnumerable<string>
,因此您可以直接使用Linq方法(例如Distinct
或Where
) 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
或两者的某种组合。