按搜索条件C#LINQ排序

时间:2009-08-07 19:48:01

标签: c# linq sorting

我有一个LINQ查询,它在多个字段中搜索字符串(使用正则表达式)。我想根据找到文本的字段对结果进行排序。

目前我有这个:

var results = from i in passwordData.Tables["PasswordValue"].AsEnumerable()
           where r.IsMatch(i.Field<String>("Key").Replace(" ","")) ||
           r.IsMatch(i.Field<String>("Username").Replace(" ","")) ||
           r.IsMatch(i.Field<String>("Other").Replace(" ",""))
           orderby i.Field<String>("Key"),
           i.Field<String>("Other"),
           i.Field<String>("Username")
           select i;

我希望在Key中找到匹配项,然后在Other中找到匹配项,然后在Username中找到匹配项。如果可能,匹配Key和Other的匹配应该在匹配Key之前匹配。

我目前根据Key首先对代码进行排序,因此如果在“其他”上找到匹配但按键以A开头,则会在Key上找到匹配之前对其进行排序,其中Key以Z开头。

在此先感谢,我认为这不是一个难题,但由于我是LINQ的新手,我无法弄清楚如何做到这一点。

3 个答案:

答案 0 :(得分:7)

使用let关键字捕获中间值,您可以在排序匹配值之前轻松排序是否匹配:

var results = from i in passwordData.Tables["PasswordValue"].AsEnumerable()
              let fields = new {
                  Key = i.Field<String>("Key"),
                  Username = i.Field<String>("Username"),
                  Other = i.Field<String>("Other") }
              let matches = new {
                  Key = r.IsMatch(fields.Key.Replace(" ","")),
                  Username = r.IsMatch(fields.Username.Replace(" ","")),
                  Other = r.IsMatch(fields.Other.Replace(" ","")) }
              where matches.Key || matches.Username || matches.Other
              orderby matches.Key descending, fields.Key,
              matches.Username descending, fields.Username,
              matches.Other descending, fields.Other
              select i;

答案 1 :(得分:0)

您的一个解决方案是创建2个方法,一个用于密钥搜索,另一个用于其他搜索。然后根据搜索到的字段,您按顺序运行。虽然这可能是额外的编码,但是我认为这样做的唯一方法就是创建自己的表达树,而这些树更难实现。

答案 2 :(得分:0)

这是一种简单但性能欠佳的方法:

static IEnumerable<DataRow> DoSearch(DataTable table, RegEx r, string fieldName) {
    return table.AsEnumerble()
                .Where(row => r.IsMatch(row.Field<string>(fieldName).Replace(" ", ""))
                .OrderBy(row => row.Field<string>(fieldName));

}

var table = passwordData.Tables["PasswordValue"];
var results = DoSearch(table, r, "Key")
    .Union(DoSearch(table, r, "Username")
    .Union(DoSearch(table, r, "Other");

如果行匹配多个字段,Union方法将过滤掉重复项。