LINQ查询和字符串数组

我有一个string数组说:

 String[] Fields=new String[]{RowField,RowField1} 

我可以使用以下查询通过指定值来获取值,即查询,即RowFieldRowField1

 var Result = ( from x in _dataTable.AsEnumerable() select new { Name = x.Field(RowField), Name1 = x.Field(RowField1) }) .Distinct(); 

但是假设我在Array有很多值,比如:

 String[] Fields= new String[] { RowField, RowField1, RowField2, ....... RowField1000 }; 
  • 如何在不指定查询中的每个行字段的情况下使用此处的查询?
  • 我如何遍历LINQ中的数组项?

实际上,您希望从DataTable中检索特定字段,而无需对字段名称进行硬编码。

以下代码将返回每行一个字典对象以及您在数组中指定的字段。 无需创建其他扩展方法或比较器:

 var result = (from row in _dataTable.AsEnumerable() let projection = from fieldName in fields select new {Name = fieldName, Value = row[fieldName]} select projection.ToDictionary(p=>p.Name,p=>p.Value)); 

内部选择从每个表行中选择所需的字段值,并将它们存储在投影变量中。 外部选择在Dictionary中转换此变量

您可以迭代结果以获取如下特定字段:

 foreach (var row in result) { Console.WriteLine(row["field1"]); } 

编辑:上面的代码不返回不同的值。 可以返回不同的值而无需使用group by编写特殊的比较器但代码不是很漂亮:

 var result = (from row in table.AsEnumerable() let projection = from fieldName in fields select new { Name = fieldName, Value = row[fieldName] } group projection by projection.Aggregate((v, p) => new { Name = v.Name + p.Name, Value = (object)String.Format("{0}{1}", v.Value, p.Value) }) into g select g.FirstOrDefault().ToDictionary(p=>p.Name,p=>p.Value)); 

聚合创建一个新投影,其名称和值属性是所有名称和值字段的串联。 聚合的结果用于对所有行进行分组并返回每个组的第一行。 它有效,但绝对是丑陋的。

最好像下面的代码一样创建一个简单的DictionaryComparer:

  public class DictionaryComparer: EqualityComparer> { public override bool Equals(Dictionary x, Dictionary y) { //True if both sequences of KeyValuePair items are equal var sequenceEqual = x.SequenceEqual(y); return sequenceEqual; } public override int GetHashCode(Dictionary obj) { //Quickly detect differences in size, defer to Equals for dictionaries //with matching sizes return obj.Count; } } 

这允许你写:

  var result = (from row in table.AsEnumerable() let projection = from fieldName in fields select new {Name = fieldName, Value = row[fieldName]} select projection.ToDictionary(p=>p.Name,p=>p.Value)) .Distinct(new DictionaryComparer()); 
 var Result = ( from x in _dataTable.AsEnumerable() select ( from y in Fields select new KeyValuePair(y, x)) .ToDictionary()) .Distinct(DictionariesComparer); 

您还需要编写自己的.ToDictionary()扩展方法和DictionariesComparer方法(因为Dictionary不实现IEquatable )。

没有foreach linq表达。 我通常创建自己的扩展方法

有点像:

 public static void Foreach(this IEnumerable items, Action action) { foreach(T t in items) { action(t); } } 

但是请注意,如果你计划在Linq2SQL中使用它,因为它可能会创建大量的db命中!