代码之家  ›  专栏  ›  技术社区  ›  Adam

使用逗号指定的linq by列值按相关性对数据表排序

  •  1
  • Adam  · 技术社区  · 15 年前

    row[0] = Tag1
    row[1] = Tag1, Tag2
    row[2] = Tag2, Tag3
    row[3] = Tag1, Tag2, Tag3
    row[4] = Tag4, Tag6
    

    用逗号分隔

    等。。

    因此,从上面的示例行中,除了第[4]行之外,还返回上面的所有行

    下面是我丢失的一点,我现在想按与当前文档匹配的标记数对datatable进行排序。因此,就我目前所讲的例子而言,它们应该是有序的

    row[3] = Tag1, Tag2, Tag3
    row[1] = Tag1, Tag2
    row[2] = Tag2, Tag3
    row[0] = Tag1
    

    以前没有用过linq,但被告知它可以做到这一点。

    到目前为止我已经

    var query = from c in dt.AsEnumerable()
                        orderby c.Field<string>("Tags").CompareTo(dr["Tags"]) ascending
                        select c;
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   kbrimington    15 年前

    我想这样的东西合适。试一试:

    // Here, I construct a simple table for demonstration
    var table = new DataTable();
    var column = table.Columns.Add("Tags", typeof(string));
    table.Rows.Add("Tag1");
    table.Rows.Add("Tag1, Tag2");
    table.Rows.Add("Tag2, Tag3");
    table.Rows.Add("Tag1, Tag2, Tag3");
    table.Rows.Add("Tag4, Tag6");
    
    // The separator is convenient for using the string.Split override
    // that strips empty results
    var separator = new[] { ",", " " };
    
    // For the demo, we'll sort by number of tags matching the third row
    var current = table.Rows[2];
    
    // This splits the string into an array for convenient processing later
    var currenttags = current.Field<string>("Tags")
                             .Split(separator, StringSplitOptions.RemoveEmptyEntries);
    
    // The query splits out each tags field into an array convenient for processing,
    // counts the number of tags contained in the currenttags array,
    // sorts, and then selects the entire row.
    var query = from row in table.AsEnumerable()
                let tags = row.Field<string>("Tags")
                              .Split(separator, StringSplitOptions.RemoveEmptyEntries)
                let count = tags.Count(t => currenttags.Contains(t))
                orderby count descending
                select row;
    
        2
  •  2
  •   Vinay B R    15 年前

    //test data
    DataTable table = new DataTable();
            var column = table.Columns.Add("Tags", typeof(string));
            table.Rows.Add("Tag1");
            table.Rows.Add("Tag1,Tag2");
            table.Rows.Add("Tag2,Tag3");
            table.Rows.Add("Tag1,Tag2,Tag3");
            table.Rows.Add("Tag4,Tag6");
            string[] currentTags = new string[] { "Tag1", "Tag2", "Tag3" };
    
    //actual code
            var a = from row in table.AsEnumerable()
                    let cData = (row["Tags"] as string).Split(new char[] { ',' }).Intersect(currentTags)
                    orderby cData.Count() descending
                    select cData;
    
        3
  •  0
  •   Adam    15 年前
            string[] Tags = dr["Tags"].ToString().Split(new char[] { ',' });
            string SqlClause = "";
    
            for (int i = 0; i < Tags.Length; i++)
            {
                if (i != Tags.Length - 1)
                {
                    SqlClause += "Tags LIKE '%" + Tags[i] + "%' OR ";
                }
                else
                {
                    SqlClause += "Tags LIKE '%" + Tags[i] + "%'";
                }
            }
    
            DataTable dt = ArticleCollection(SqlClause);
    
            var seperator = new[] { ",", " " };
            var current = dr["Tags"].ToString();
            var currenttags = dr.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries);
    
            DataTable query = (from row in dt.AsEnumerable()
                        let tags = row.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries)
                        let count = tags.Count(t => currenttags.Contains(t))
                        orderby count descending
                        select row).CopyToDataTable();
    
            for (int i = 0; i < query.Rows.Count; i++)
            {
                if (query.Rows[i]["Title"].ToString() == dr["Title"].ToString())
                {
                    query.Rows[i].Delete();
                }
            }
    
            TagsRepeater.DataSource = query;
            TagsRepeater.DataBind();
    
        }
    }
    
    DataTable ArticleCollection(string whereClause)
    {
    
        DataSet ds = TreeHelper.SelectNodes("/%", false, "CriticalCare.Conclusion;CriticalCare.Literature;CriticalCare.Theory", whereClause, " ", -1, true);
        DataTable dt = new DataTable();
    
        if (!DataHelper.DataSourceIsEmpty(ds))
        {            
            for (int i = 0; i < ds.Tables.Count; i++)
            {
                dt.Merge(ds.Tables[i]);
            }
            return dt;
        }
        return null;
    }
    

    }

    推荐文章