LINQ查询和字符串数组
我有一个string
数组说:
String[] Fields=new String[]{RowField,RowField1}
我可以使用以下查询通过指定值来获取值,即查询,即RowField
和RowField1
:
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 };
实际上,您希望从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命中!
上述就是C#学习教程:LINQ查询和字符串数组分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/983347.html