如果我資料庫里面有50萬資料,我給一個條件 2-5-6-3-7-5-4,代表某一列的第一個數字,我查找到這個條件的連續的行的下一行,這個有什么最好的辦法,如圖

我就查得到那個9,因為上面的連續行滿足了提供條件,必需是連續的,中間不能斷檔。
如果您有更好的方式,可以加我的Qq:68345106 ,我這邊可以付費用。
uj5u.com熱心網友回復:
IEnumerable<IEnumerable<string>> seq(<List<string> data, n)
{
for (int i = 0; i < data.Count - n; i++)
yield return data.Skip(i).Take(n);
}
void Main()
{
List<string> data = { "23456", "57876", "63465", ... };
string cond = "2-5-6-3-7-5-4";
var query = seq(data, cond.Split('-').Count() + 1)
.Where(x => x.Take(x.Count() - 1).Zip(cond.Split('-'), (a, b) => a.StartsWith(b)).All())
.Select(x => x.Last());
foreach (var item in query)
Console.WriteLine(item);
}
uj5u.com熱心網友回復:
怎么還不結帖啊。手癢寫下。vb代碼Sub Main()
For i = 0 To 4
Console.WriteLine("輸入篩選數字:")
Dim MatchS = Console.ReadLine
Dim rlt = MatchNumber(MatchS)
If Not rlt Is Nothing Then rlt.ForEach(Sub(t) Console.WriteLine(t))
Next
Console.Read()
End Sub
Function MatchNumber(MatchS As String) As List(Of String)
Dim sList = MatchS.ToList
Dim tb = (New testDataDataContext).tpTest
Dim datalist = tb.Select(Function(dr) New With {Key .id = dr.id, .s1 = dr.ValueS.Substring(0, 1)}).Where(Function(r) r.s1.Equals(sList.First))
Dim OutTxt = New List(Of String)
datalist.ToList.ForEach(Sub(dr)
Dim MatchData = tb.Where(Function(r) r.id >= dr.id).Select(Function(x) New With {Key .id = x.id, .s1 = x.ValueS.Substring(0, 1)}).Take(sList.Count)
Dim CompareS = String.Join("", MatchData.Select(Function(r) r.s1))
If CompareS.Equals(MatchS) Then
Dim curMaxId = MatchData.Max(Function(r) r.id)
Dim rltDataRow = tb.Where(Function(d) d.id > curMaxId).Take(1)
OutTxt.Add(rltDataRow.Select(Function(r) r.ValueS).ToArray(0))
End If
End Sub)
If OutTxt.Count > 0 Then
Return OutTxt
Else
Return Nothing
End If
End Function
uj5u.com熱心網友回復:
這是正解,厲害厲害,迭代器用得真漂亮。拋磚引玉下。轉成VB代碼
Sub TestIterators(MatchS As String)
Dim datacontext = New testDataDataContext
Dim tb = datacontext.tpTest
Dim dataList = tb.Select(Function(dr) dr.ValueS).ToList
Dim iterator1 = Iterator Function(data1 As List(Of String), n As Integer)
For i = 0 To data1.Count - n
Yield data1.Skip(i).Take(n)
Next
End Function
Dim qry = iterator1(dataList, MatchS.ToArray.Count + 1).Where(Function(x) x.Take(x.Count - 1).Zip(MatchS.ToList, Function(a, b) a.StartsWith(b)).All(Function(c) c = True)).Select(Function(rlt) rlt.Last)
If qry.Count > 0 Then
qry.ToList.ForEach(Sub(x) Console.WriteLine(x.ToString))
End If
datacontext.Dispose()
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/133808.html
標籤:LINQ
上一篇:vb.net中撰寫的ashx檔案中無法使用response.. 小白求問
下一篇:vb.net文本比對求助
