包含int和string的List of List,需要根据TrackBar输出X个int值最大的字符串(不是排序的list)
A List of Lists containing int and string, need to output X strings with highest int values based on TrackBar (not a sorted list)
我有一个结构如下的列表:
"Then a sentence woop", 340
"and another one", 256
"in order they appear", 700
"in a linked file", 304
该列表包含文本文件每个段落中得分最高的句子。我需要输出每个句子,但使用轨迹栏可以减少显示的数量。
所以去掉得分最低的句子,问题是列表是按照原文中出现的句子排序的,输出需要按照这个顺序。所以如果我有上面列表的轨迹栏,它会有 4 个点。如果我把它移到第 3 点,第 2 句就会消失,第 2 点第 2 句和第 4 句就会消失。
生成列表的代码是:
public List<ScoredSentence> buildSummarySentenceList()
{
List<ScoredSentence> ultimateScoreslist = new List<ScoredSentence>();
scoreCoord2 = -1;
for (int x1 = 0; x1 < results.Length; x1++)
{
List<ScoredSentence> paragraphsScorelist = new List<ScoredSentence>();
for (int x2 = 0; x2 < results[x1].Length; x2++)
{
scoreCoord2++;
paragraphsScorelist.Add(new ScoredSentence(results[x1][x2], intersectionSentenceScores[scoreCoord2]));
}
var maxValue = paragraphsScorelist.Max(s => s.score);
string topSentence = paragraphsScorelist.First(s => s.score == maxValue).sentence;
int topScore = paragraphsScorelist.First(s => s.score == maxValue).score;
ultimateScoreslist.Add(new ScoredSentence(topSentence, topScore));
}
return ultimateScoreslist;
}
public class ScoredSentence
{
public string sentence { get; set; }
public int score { get; set; }
public ScoredSentence(string sentence, int score)
{
this.sentence = sentence;
this.score = score;
}
}
这段代码循环遍历一个锯齿状数组和一个句子到句子分数的列表,它会产生一个列表,如顶部所示。
目前我是每句输出,有句就设置trackbar:
protected void summaryOutput()
{
List<ScoredSentence> ultimateScoreslist = buildSummarySentenceList();
trackBSummaryPercent.Maximum = ultimateScoreslist.Count;
lblNoOfLines.Text += trackBSummaryPercent.Maximum.ToString();
//make 2 lists for the reduction????
for (var x = 0; x < ultimateScoreslist.Count; x++)
{
TextboxSummary.Text += ultimateScoreslist[x].sentence + "\n";
}
}
我想过在跟踪栏的每个 onchange tick 上有第二个克隆列表并删除最低值的条目。然后,当向上移动栏以某种方式将丢失的条目从克隆列表中移回时。我不喜欢这种方法,因为它可能会导致程序速度问题,例如当我当前的测试文本长 100 段时,并且移动轨迹栏很多可能会使其变慢。
将显示的 属性 添加到您的 ScoredSentence
对象。然后每当列表发生变化,或者轨迹栏选择发生变化时,运行 这个方法就可以更新显示元素的集合。主列表应始终按照您希望显示的顺序排序。 numberToDisplay
将通过您使用的任何方式计算 UI 到项目数。
public void OnUpdate()
{
var orderedEnumerable = ScoresList.OrderByDescending (s => s.Score);
foreach (var s in orderedEnumerable.Take (numberToDisplay))
{
s.Displayed = true;
}
foreach (var s in orderedEnumerable.Skip(numberToDisplay))
{
s.Displayed = false;
}
}
然后在需要显示的时候使用下面的代替列表
ScoredSentences.Where(s=> s.Displayed);
我有一个结构如下的列表:
"Then a sentence woop", 340
"and another one", 256
"in order they appear", 700
"in a linked file", 304
该列表包含文本文件每个段落中得分最高的句子。我需要输出每个句子,但使用轨迹栏可以减少显示的数量。
所以去掉得分最低的句子,问题是列表是按照原文中出现的句子排序的,输出需要按照这个顺序。所以如果我有上面列表的轨迹栏,它会有 4 个点。如果我把它移到第 3 点,第 2 句就会消失,第 2 点第 2 句和第 4 句就会消失。
生成列表的代码是:
public List<ScoredSentence> buildSummarySentenceList()
{
List<ScoredSentence> ultimateScoreslist = new List<ScoredSentence>();
scoreCoord2 = -1;
for (int x1 = 0; x1 < results.Length; x1++)
{
List<ScoredSentence> paragraphsScorelist = new List<ScoredSentence>();
for (int x2 = 0; x2 < results[x1].Length; x2++)
{
scoreCoord2++;
paragraphsScorelist.Add(new ScoredSentence(results[x1][x2], intersectionSentenceScores[scoreCoord2]));
}
var maxValue = paragraphsScorelist.Max(s => s.score);
string topSentence = paragraphsScorelist.First(s => s.score == maxValue).sentence;
int topScore = paragraphsScorelist.First(s => s.score == maxValue).score;
ultimateScoreslist.Add(new ScoredSentence(topSentence, topScore));
}
return ultimateScoreslist;
}
public class ScoredSentence
{
public string sentence { get; set; }
public int score { get; set; }
public ScoredSentence(string sentence, int score)
{
this.sentence = sentence;
this.score = score;
}
}
这段代码循环遍历一个锯齿状数组和一个句子到句子分数的列表,它会产生一个列表,如顶部所示。
目前我是每句输出,有句就设置trackbar:
protected void summaryOutput()
{
List<ScoredSentence> ultimateScoreslist = buildSummarySentenceList();
trackBSummaryPercent.Maximum = ultimateScoreslist.Count;
lblNoOfLines.Text += trackBSummaryPercent.Maximum.ToString();
//make 2 lists for the reduction????
for (var x = 0; x < ultimateScoreslist.Count; x++)
{
TextboxSummary.Text += ultimateScoreslist[x].sentence + "\n";
}
}
我想过在跟踪栏的每个 onchange tick 上有第二个克隆列表并删除最低值的条目。然后,当向上移动栏以某种方式将丢失的条目从克隆列表中移回时。我不喜欢这种方法,因为它可能会导致程序速度问题,例如当我当前的测试文本长 100 段时,并且移动轨迹栏很多可能会使其变慢。
将显示的 属性 添加到您的 ScoredSentence
对象。然后每当列表发生变化,或者轨迹栏选择发生变化时,运行 这个方法就可以更新显示元素的集合。主列表应始终按照您希望显示的顺序排序。 numberToDisplay
将通过您使用的任何方式计算 UI 到项目数。
public void OnUpdate()
{
var orderedEnumerable = ScoresList.OrderByDescending (s => s.Score);
foreach (var s in orderedEnumerable.Take (numberToDisplay))
{
s.Displayed = true;
}
foreach (var s in orderedEnumerable.Skip(numberToDisplay))
{
s.Displayed = false;
}
}
然后在需要显示的时候使用下面的代替列表
ScoredSentences.Where(s=> s.Displayed);